class文件结构
- MagicNumber:文件类型
- Minor Version:小版本标识
- Major Version:大版本号
- constant_pool_count:常量池数量
- constant_poo:常量池具体实现
- access_flags:class文件修饰符
- this_class:当前类名
- super_class:父类名
- interfaces_count:实现接口数
- interfaces:实现接口
- fields_count:字段数
- fields:具体字段
- methods_count:方法数
- methods:具体方法
- attributes_count -u2:其他属性数
- attributes:其他属性具体实现
javap命令
JBE 可以直接修改
jClasslib
类加载与初始化
-
Loading
-
双亲委派机制,主要出于安全来考虑。先自Custom ClassLoad向上检查该类是否已经加载,已经加载则返回,如果直到Bootstrap也未查找到内存中有加载,则自顶向下加载,加载完成则返回。
- Bootstrap:加载lib/rt.jar charset.jar等核心类,C++实现
- Extension:加载扩展jar包 jre/lib/ext/*.jar或由-Djava.ext.dirs指定
- App:加载classpath指定内容
- Custom ClassLoad:自定义ClassLoad
-
LazyLoading五中情况
- new getstatic putstatic invokestatic指令,访问final变量除外
- java.lang.reflect对类进行反射调用
- 初始化子类的时候,父类首先初始化
- 虚拟机启动时,被执行的主类必须初始化
- 动态语言支持java.lang.invoke.MethodHandle解析的结果为REF_getstatic REF_putstatic REF_invokestatic的方法句柄时,该类必须初始化
-
ClassLoader
findInCache:先在内存中查找是否加载,已加载则返回,否则去parent.LoadClass中继续先查找内存中是否加载过此类,否则继续去parent.LoadClass直到最高级,如果还是没有找到则从顶级开始findClass加载类到内存。
-
Linking
- Verification:验证文件是否符合JVM规定
- Preparation:静态成员变量赋默认值
- Resolution:将类、方法、属性等符号引用解析为直接引用,常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用
-
Initializing
调用类初始化代码,给静态成员变量赋初始值
对象在内存中的存储布局
- 对象头:markword 8个字节
- ClassPointer指针:-XX:+UseCompressedClassPointers 为4个字节,不开启为8个字节
- 实例数据:引用类型(如String)-XX:+UseCompressedOops 为4个字节,不开启为8个字节
- Padding:对齐为8的倍数
对象头(64位)
锁状态 |
31bit |
4bit |
1bit(是否偏向锁) |
2bit(锁标志位) |
26bit |
无锁态 |
对象的hashCode |
分代年龄 |
0 |
01 |
unused |
轻量级锁 |
指向栈中锁记录的指针 |
00 |
重量级锁 |
指向互斥量(重量级锁)的指针 |
10 |
GC标记 |
空 |
11 |
偏向锁 |
线程ID |
Epoch、分代年龄 |
1 |
01 |
混合模式
解释器+JIT
- 混合使用解释器 + 热点代码编译
- 起始阶段采用解释执行
- 热点代码检测
- 多次被调用的方法(方法计数器:检测方法执行频率)
- 多次被调用的循环(循环计数器:检测循环执行频率)
- 进行编译
- -Xmixed默认为混合模式,开始解释执行,启动速度较快,对热点代码实行检测和编译
- -Xint使用解释模式,启动很快,执行较慢
- -Xcomp使用纯编译模式,执行很快,启动很慢
JVM虚拟机(1)
原文:https://www.cnblogs.com/allen167/p/13904716.html