JVM 核心技术
JAVA 前言
系统指标
字节码
javap -c HelloWorld.class -- 反编译
javap -c verbose HelloWorld.class -- 输出附加信息
案例一:
#1 = Methodref #4.#13 // java/lang/Object."<init>":()V
含义:
#1 常量编号, 该文件中其他地方可以引用。
= 等号就是分隔符.
Methodref 表明这个常量指向的是一个方法;具体是哪个类的哪个方法呢? 类指向的 #4, 方法签名指向的
#13; 当然双斜线注释后面已经解析出来可读性比较好的说明了。
案例二:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
含义:
([Ljava/lang/String;)V : 其中小括号内是入参信息/形参信息;左方括号表述数组;L 表示对象;后面的java/lang/String就是类名称;小括号后面的 V 则表示这个方法的返回值是 void;
flags: ACC_PUBLIC, ACC_STATIC : 表示 public 和 static
stack=2, locals=2, args_size=1 : 执行该方法时需要的栈(stack)深度是多少,需要在局部变量表中保留多少个槽位, 还有方法的参数个数
注意: 无参构造函数的参数个数是1, 因为this也要占一个位置。
案例三:
初始化对象三部曲:
初始化对象
- new 占三位,创建对象
- dup 复制栈顶引用值
- invokespecial 执行对象初始化
astore {N} or astore_{N} – 赋值给局部变量,其中 {N} 是局部变量表中的位置。
iconst_{N} 用来将常量值N加载到栈里面
istore_{N} 将变量存储到在 LocalVariableTable 的槽位 N 中。
dstore 4 将 double 值保存到本地变量4号槽位
putfield – 将值赋给实例字段
putstatic – 将值赋给静态字段
swap 指令用来交换栈顶两个元素的值
pop 指令则从栈中删除最顶部的值。
dup 指令复制栈顶元素的值。
dup_x1 将复制栈顶元素的值,并在栈顶插入两次
dup2_x1 则复制栈顶两个元素的值,并插入第三个值类加载器
Java 内存模型

JVM 启动参数
Java Debug 工具
tool name
info
GC 算法
垃圾收集器
实践
案例分析
Last updated