深入理解 ContextClassLoader

类的加载器大多都遵循双亲委托机制,它不仅可以避免一个类被重复加载,也能够避免 Java 核心类被篡改,越基础的类由越上层的类加载器加载。但程序设计往往没有绝对不变的规则,如果有核心类想要调用用户的代码,那该怎么办?

深入理解 ClassLoader

ClassLoader 源码初探

类加载器用于加载 Java 类到虚拟机中,其实现类 java.lang.ClassLoader 是一个抽象类,其职责是通过指定类的完全限定名 ( binary name ),找到或生成这个类对应的字节码,这些字节码中包含类的定义数据,通过字节码就可以构造出一个 java.lang.Class 对象。

每个 Class 对象都包含一个定义它的类加载器的引用,而数组的 Class 对象不是用类加载器创建的,而是在 Java 运行时根据需要自动创建的,如果调用数组的 Class 对象的 getClassLoader() 方法返回的类加载器与其元素类型的类加载器相同,如果数组元素是基本数据类,则没有类加载,返回空。比如:

// C为自定义类
C[] cs = new C[2];
// jdk.internal.loader.ClassLoaders$AppClassLoader@3d4eac69
System.out.println(cs.getClass().getClassLoader());

int[] is = new int[2];
// null
System.out.println(is.getClass().getClassLoader());
深入理解JVM类加载机制

Java 代码在编译过后,想要被运行和使用,经过的第一个步骤就是将编译后的字节码文件加载的虚拟机,那虚拟机是如何把字节码文件加载到虚拟机的呢,接下来以一系列实例对这一流程作简要分析与介绍。

类编译过程

Java 源码通过 JDK 自带的 Javac 编译器编译成 class 文件,我们把 class 文件中包含的代码称为字节码。但字节码并不能直接在计算机上运行,所以 JVM 需要将字节码翻译成机器码,其大致流程如下图所示。
Java类编译过程示意图
一般会把.java文件编译成.class文件的过程称为前端编译,其由 JDK 自带的 javac 工具完成。前端编译是一个非常复杂的过程,包含词法分析、注解处理、语义分析等,因此,代码中的大部分语法错误,在这个阶段就能够被识别出来。

编译后的字节码文件中主要包含常量池和方法表集合两个部分,可以通过 Javap 命令来查看,后面的文章也会详细的讲解。

接下来,JVM 会把 class 文件中的字节码加载到内存中,经过连接和初始化以后,类在调用执行的过程中,会继续把字节码翻译成机器码,这个翻译过程在 Hotspot 中有两种形式:

  • 解释执行:逐条将字节码翻译成机器码并执行
  • 即时编译:将一个方法中所包含的所有字节码编译出机器码后再执行

在起始阶段,JVM 中的字节码是由解释器(Interpreter)完成编译的,当虚拟机发现某个方法或代码块的运行特别频繁时,这些代码块就会被认定为热点代码。为了提高热点代码的执行效率,在运行时,JIT 会把这些代码编译成本地平台相关的机器码,并进行各层次的优化,然后保存到内存中,这一过程就被称为即时编译。

这种将两种编译方式混合执行的策略,在上图中被描述为“运行时编译”,也是 Hotspot 默认采用的策略。

非奋斗减肥:关于运动和减脂的一些小误区

最近一段时间想控制下体重,随手翻的健康类书籍比较多,在这本「非奋斗减肥」中确实收获到不少与常规认知有差异的知识。

Part ONE

首先,介绍几种日常生活中随处都能听到,但又说不明白的几种物质。

胰岛素

当我们摄入糖类食物时,食物中的糖开始被不同的酶分解,最终被小肠吸收后转化成为葡萄糖,通过血液输送到全身。血液中的葡萄糖转化为糖原后,会优先储存在肝脏和肌肉当中,但是肝脏和肌肉中储存糖原的空间十分有限。剩余的大量糖原就会进入脂肪细胞,转化成为脂肪储存在人体内,于是肥胖就形成了。

当血液中的葡萄糖升高时,胰腺就开始工作了。胰腺会分泌胰岛素,胰岛素的作用就是促进血液中的葡萄糖转移到细胞中,帮助调节血糖,保证血糖值维持在一定的安全水平。因此,你摄入的糖越多,胰腺就要分泌更多的胰岛素来调节血糖,那么就会有更多的糖原进入脂肪细胞中。更重要的是,如果血液中的胰岛素水平长期居高不下,那么细胞对胰岛素的敏感度就会降低,形成胰岛素抵抗

胰岛素抵抗,跟抗生素的耐药性是一样的道理,对于有胰岛素抵抗的人来说,同等剂量的胰岛素无法使原先血液中的糖原进入细胞,于是胰腺就需要分泌更多的胰岛素才能把血糖降下来。而胰岛素又是促进脂肪合成的激素,这些大量的胰岛素会使身体合成更多的脂肪,所以胰岛素抵抗是现代人日渐肥胖的主要原因之一。胰岛素抵抗最容易导致腹部脂肪堆积。如果你的腰围和臀围的比例大于 0.9,就有较大可能存在明显的胰岛素抵抗。

因此,胰岛素又被称为肥胖激素,想要把胰岛素控制在很低的水平,关键就是控制糖的摄入。

非奋斗减肥 Photo by Dose Juice

我要开始卷腹肌

年初下定了决心今年体重一定要掉到 110 斤,但从春节后就一直没怎么运动,饮食也没节制,体重相较与去年还涨了近 10 斤。眼看时间来到了 5 月,时间也快过半了,想想也该行动起来了。

我要开始卷腹肌Photo by bruce mars

在 B 站上找了个 练腹肌的课程,不仅能跟着练,还介绍了饮食的底层逻辑,甚至还推荐了食谱。正好最近也看了基本有关健康的书籍,结合自己的实际情况,定制了下面的食谱。

像速食鸡胸肉、荞麦面、面包这些东西,我先前吃得也不多,也不知道好不好吃,但暂且先吃着。

饮食原则

根据课程的内容,总结了几点我的饮食原则:

  • 规律进食,饿了才吃,不饿不吃
  • 避免 添加糖 的食物和饮料,常见的饮料、甜食、零食、罐头等都含有大量的添加糖
  • 避免油炸、油焖、干锅、红烫火锅、重口川菜等 多油 的食谱
  • 不吃猪蹄、五花肉、鸡皮、油炸薯片等 脂肪过高 的食物
  • 少吃腊肉、腌肉、话梅等 重盐 食物
  • 每天喝 2.5L-3L 水
  • 每周可以有 1 顿欺骗餐,跟同事聚会、朋友聚餐等,但大餐吃饱即可,不要吃撑
  • 减脂期饿是常态,如果每天睡前,没有微微的饥饿感,那么证明你今天吃太多了