JVM 从入门到入土 ①:类加载过程

Java 从编码到执行

  • -Xmixed:混合模式
    • 使用解释器 + 热点代码编译
    • 起始阶段采用解释执行
    • 热点代码检测
      • 多次被调用的方法(使用 方法计数器 检测方法执行频率)
      • 多次被调用的循环(使用 循环计数器 检测循环执行频率)
      • 进行编译
  • -Xint:解释模式,启动快,执行慢
  • -Xcomp:编译模式,启动慢,执行快

Class 文件结构

Class 文件实际上是二进制字节流,JVM 定义了一系列规范,用把 Class 文件 “翻译” 成 Class 类

逻辑上划分的数据类型:u1(1 字节)、u2(2 字节)、u4(4 字节)、u8(8 字节)和 _info(表类型)
_info 的来源是 hotspot 源码中的写法

1. 查看 16 进制字节码

.java 文件使用 javac 命令进行编译后得到 .class 文件
可以使用 BinEd(IDEA 插件)查看 .class 文件的 16 进制字节码

ByteCode 类:

1
2
3
4
package com.test.jvm.bytecode;

public class ByteCode {
}

对应 .class 文件的编码:

2. Class 文件构成

使用 JClassLib(IDEA 插件)查看 ByteCode

classfile 构成:
image.png

对应关系

常量:

  • 常量池 #1 号标记:
    • 标记位 07(1 字节),表明了常量类型
    • 索引 00 0e(2 字节),代表指向常量池 #14 号标记

类加载过程

类是在 运行期间第一次使用 时动态加载的,而不是编译时期一次性加载。因为如果在编译时期一次性加载,那么会占用很多的内存。

loadClass () 中实现了双亲委派机制,委托给父加载器去执行,父加载器没找到则会调用自己的 findClass () 去找

  • 自定义类加载器:重写 findClass ()
  • 打破双亲委派机制:重写 loadClass ()