-
class文件组成
虚拟机指令、符号表、其他辅助信息 -
数据结构
无符号数:字面量(数值)
表:一个数据结构,以_info结尾这样 -
class文件分析工具
Notepad安装插件HexEditor -
class文件格式
-
类生命周期
1.加载
1.获取二进制字节流
2.静态存储结构转化为方法区的运行时数据结构
3.在Java堆里面生成一个类对象,作为方法区的访问入口。
2.验证
1.验证Class文件的标识:魔数Magic Number
2.验证Class文件的版本号
3.验证常量池(常量类型、常量类型数据结构是否正确、UTF8是否符合标准)
4.Class文件的每个部分(字段表、方法表等)是否正确
5.元数据验证(父类验证、继承验证、final验证)
6.字节码验证(指令验证)
7.符号引用验证(通过符号引用是否能找到字段、方法、类)
3.准备
为类变量分配内存并且设置类变量的初始化阶段。
只对static类变量进行内存分配。
static int n = 2;
初始化值是0,而不是2。因为这个时候还没执行任何Java方法(<clinit>)。
static final int n = 2;
对应到常量池 ConstantValue,在准备阶段n必须被赋值成2。
类变量:一般称为静态变量。
实例变量:当对象被实例化的时候,实例变量就跟着确定。随着对象销毁而销毁。
4.解析
对类、字段、方法、接口进行解析
5.初始化
<clinit>静态变量,静态块的初始化
<init>类的初始化
6.使用
7.卸载
- JVM怎么判断热点代码
-
抽样判断
jvm周期性去栈顶查看被调用的方法.若经常出现的方法,就视为热点代码,这种方法实现起来简单,缺点是很难精确的知道一个方法的热度,容易受线程堵塞和外界因素的影响. -
计算器判断
通过计算器判断代码被调用的次数,虚拟机给方法或者代码块建立计算器,统计方法被调试次数,超过一定次数就视为热点代码,触发JIT编译。hotspot使用的是计算器判断,它使用了两类计数器:方法调用计数器和回边计数器.
-