java类加载流程
2022-05-26 17:31:40 0 举报
java 的类加载过程
作者其他创作
大纲/内容
- 只有热点代码才会触发JIT- 热点代码在编译时无法确认,但是执行时可能被多次调用- JVM运行期间,进行\"二次编译\",把热点代码编译为【本地平台linux的机器码】
CGLib
mixed=纯字节码+纯编译
准备
部分Hot代码,JIT转译
ASM
C2:Server启动慢,效率高,默认模式
类构造器
扩展类加载器
https://www.bilibili.com/video/BV1SZ4y1Z7Zp?from=search&seid=14815045528756143602&spm_id_from=333.337.0.0
public int n1=10;
classpath/java/class/path
JIT
拓展类加载器Extension ClassLoader
类装载过程
Linux
JAVA:编译与解释共存
public static void main{ System.out.println(\"......\"); methodA();}
javac
本地方法接口
public static final int n3=10;
混合编译
JAVA_HOME/lib/ext
.class
编辑.class字节码
任意来源
C1:Client启动块,占用小,默认不进行动态编译
自顶向上检查
.class二进制字节码
防止类的重复加载
卸载
n1是实例属性,不是静态变量,因此在准备阶段,是不会分配内存n2是静态变量,分配内存n2是默认初始化0,而不是20n3是static final 是常量,他和静态变量不一样,因为一旦赋值就不变n3
双亲委派机制
JIT编译器
都说了,在连接阶段时静态变量就已经完成默认初始化了,而静态代码块在初始化阶段才会执行,当然不会报错啦
static void methodA(){ System.out.println(\"......\");}
二次编译
注入
三种执行模式
byte code
1.类加载器收到类加载请求2.将这个请求向上委托给父类加载器去完成,直到启动类加载器3.启动类加载器检查是否能加载,能,就加载 。不能就抛出异常,通知子类去加载
应用程序类加载器Application ClassLoader
加载失败,给下一级
字节码(java bytecode)
使用
JVM指令码
方法区method
本地方法库
字节码解释器
变量
加载class文件
纯字节码解释器
编译失败
初始化
机器码
静态变量
JVM解释器
热点代码
1.所有线程共享。构造函数、接口代码2.静态变量、常量、类信息(构造方法、接口定义)3.运行时的常量池
动态拦截
模板解释器(性能很高)
static{ System.out.println(\"......\");}
Mac
堆heap
.java
自定义类加载器User ClassLoader
javasist
解析
运行时数据区
验证
先编译
程序计数器
执行<clinit>方法静态代码块
后解释执行
JVM虚拟机
纯编译模式
classloader类加载器
类装载
执行引擎
类编译执行过程
本地方法栈native method stack
链接Linking
常量
public static int n1=10;
双亲委派
逃逸分析
及时编译 = 编译+解释并存
根加载器
Win
Java栈stack
JAVA_HOME/lib
加载/装载
非热点
启动类加载器Bootstrap ClassLoader
static final是在连接阶段就一次性完成了内存的分配和赋值,并且不能修改的意思吗
应用程序加载器
0 条评论
下一页