整体结构
结构分为:
本地引擎,程序计数器
JVM栈,JVM堆,方法区
上图太过详细
class -> classLaoder
load -> link -> init
运行时数据区
方法区,java 栈,本地方法栈,堆,程序计数器
执行引擎,本地方法接口,本地执行引擎
JIT 编译器
将热点代码,缓存为机器码. 在下次调用的时候直接执行.
经常出现在 栈顶的 代码,
程序计数器中数据较大的. 视为热点代码
经常调用的方法和 经常循环执行的部分代码. 视为热点代码
Load
Load
元数据: 存放在方法区. 在 class 加载之后
Link
校验: 校验class 是否正确
准备: 为 static 生成 cinit 方法
不会为 final 修饰的 static 赋值. 因为 final 在编译完后已经赋值了
不会为 实例变量分配初始化
解析: 将符号引用解析为 直接引用
Init
赋值
可以 在 static 块中对后面的 static 变量赋值. 但是不能主动使用
类加载器
自定义
自己 定义实现类加载器
实现
继承 ClassLoader 或 URLlClassLoader
可以用来 隔离加载类,修改类加载方式,扩展类来源. 防止源码泄漏
Java内置
BootStrap:
使用 C/C++实现. 用来加载 Extension,System 加载器.
Extension:
System:
常用方法
类加载
一个类 在某些情况下是会 加载到方法区的
1. 创建类实例
2. 对该类或接口静态变量访问或赋值
3. 调用静态方法
4. 反射
5. 初始化该类的子类
6. Java虚拟机启动时标记为启动类的类
7. MethodHandle 实例解析结果
JDK7 提供的特性
运行时
方法区,堆,栈,本地方方法栈,程序计数器