jvm系列
2022-12-05 00:21:19 0 举报
类加载机制、双亲委派、jvm内存、内存分配流程
作者其他创作
大纲/内容
否
3
Eden8/10
是
2
类加载流程
window系统下,java.exe调用底层的jvm.dll创建java虚拟机(C++实现)
扩展类加载器
加载:在磁盘中查找并通过IO读取到java文件,在内存中生成该类对应的java.lang.Class对象
栈
b=2
S1
main线程
sun.misc.Launcher.getLauncher()创建其他类加载器
初始化: 将静态变量赋值(代码中的指定值),执行静态代码块
EDEN
main()栈帧
堆凡是new出来的对象都放在堆中
是否已加载
S2
局部变量表
init对象
双亲委派机制
由C++创建负责加载支撑jvm运行的位于jre-lib目录下的核心类库例如:rt.jar、charsets.jar
10
堆内存
类加载器
public int compute() { int a = 1; int b = 2; int c = (a + b) * 10; return c; } public static void main(String[] args) { Math math = new Math(); math.compute(); }
类:com.example.jvm.Math
引导类加载器调用java代码加载sun.misc.Launcher
验证:验证.class字节码文件的正确性
Math.class
30 出栈
字节码执行引擎
分配内存
动态连接
minorGC?
start
this
S21/10
full GC?
父类加载失败由子类进行加载
老年代默认占整个堆内存的2/3
设置对象头
方法区(元空间)静态变量静态常量静态代码块类元信息
程序计数器
classLoader.loadClass(com.example.jvm.Math)加载要运行的类
实际的计算过程是在cpu寄存器中
栈上分配内存?
加载类
由Launcher类创建负责加载我们自己编写的应用程序类
launcher.getClassLoader()获取当前类对应的加载器classLoader
S11/10
?那些场景需要打破双亲委派机制
解析:将静态方法的符号引用替换为直接引用(比如main()方法 替换为对应内存的地址)
引导类加载器
2.为什么要设计双亲委派机制
向上委托
AGE?
应用程序类加载器
类加载检查
运行期间方法引用转为内存地址引用
a=1
年轻代默认占整个堆内存的1/3
设置初始值
准备:为静态变量做初始赋值(int =0;boolean=false)
1.为什么要从应用程序类加载器向上委托
操作数栈
创建引导类加载器实例
math实例
本地方法栈
math
调用方法间的连接点
箭头从上至下为父子关系
c
对象的创建流程
对象的内存分配
方法出口
栈:FILO
compute()栈帧
1
3.打破双亲委派机制
old
end
老年代
jvm内存模型
大对象?
由Launcher类创建负责加载支撑jvm运行的位于jre-lib-ext目录下的扩展类库
0 条评论
下一页