java流程
2021-08-19 14:46:47 11 举报
类加载到JVM内存全流程
作者其他创作
大纲/内容
JVM运行时内存(java 8)
(比如int a = 10; 10就是字面量)
操作数栈
连接(加载阶段和初始化阶段交叉进行)
Extension ClassLoader
通过java.lang.ClassLoader的子类自定义加载class
常量池
验证
javac
本地方法库
准备
确保加载的类信息符合jvm规范,检查载入Class文件数据的正确性
本地方法栈Native Method Stack
—— 线程私有
初始化这个阶段就是将静态变量(类变量)赋值的过程,即只有static修饰的才能被初始化,执行的顺序就是: 父类静态域或着静态代码块,然后是子类静态域或者子类静态代码块(静态代码块先被加载,然后再是静态属性)
BootStrap ClassLoader
加载classpath下的jar包或者-Djava.class.path指定目录下的jar包
主要做的就是为由static修饰的成员变量分配内存,并设置默认的初始值
Application ClassLoader
—— 线程共享
...... ......
初始化
当前栈帧
堆
实例化一个java.lang.Class对象,作为类信息的入口
把常量池中的符号引用转换为直接引用,说白了就是jvm会将所有的类或接口名、字段名、方法名转换为具体的内存地址
ClassLoader
栈 stack
Custom ClassLoader
类和类的元数据信息PS: 存储在native memory中,受MaxPermSize限制
类加载
元空间
加载jre/lib/rt.jar或者-Xbootclasspath指定的jar包
自下而上检查类是否已经加载
栈帧1
自顶而下尝试加载类
java文件
静态变量
执行引擎
经过javac编译成.class文件
本地库接口
(\"com.demo.A\")
符号引用
局部变量表
程序计数器Program Counter Register
返回地址
字面量
动态链接
加载jre/lib/ext/*.jar或者-Djava.ext.dirs指定目录下的jar包
解析
栈帧2
PS: 常量池包括Class文件常量池、运行时常量池,全局字符串常量池,以及基本类型包装类对象常量池。
0 条评论
下一页