JVM内存模型
2020-06-18 18:19:18 0 举报
JVM运行时数据区(内存模型)详解图。
作者其他创作
大纲/内容
偏向锁
23bit
轻量级锁
线程(Thread)
堆 -Xms -Xmx
方法出口
00
c=30
1bit
1.方法结束后,恢复上层调用位置继续执行。2.如果有返回值,直接压入栈帧中的操作栈。3.将程序计数器指向下一条命令的调用指令的地址
Math.class字节码
动态链接
survivor区
实例数据instance data
检测该类是否已被加载过,如果是,则直接返回,如果不是则委派给parent 加载。以此类推,直到bootstrapClassLoader 加载,以此返回,并从上到下依次加载。
0
Math.main()
sun.misc.Launcher.getLauncher()
parent == null
局部变量
super.loadClass
parent!=null
启动类加载器BootstrapClassLoader(C++编写)
windows系统下,java.exe调用底层的jvm.dll文件,创建Java虚拟机(C++实现)
ParallelOld收集器多线程并行老年代采用标记-整理算法。JDK1.7 JDK1.8默认。
10
栈帧->main()
执行结束后,执行自己的加载class方法。
ObjectHeader(对象头)
获取运行类,自己的加载器ClassLoader,是AppClassLoader的实例
int sum = 30
是否偏向
向上委托
锁标志位
将AppClassLoader赋值给Launcher的loader属性。
本地方法库
11
判断父加载器是否为null
说明
栈帧->compute()
类加载子系统(双亲委派)
扩展类加载器ExtClassLoader
Serial收集器 单线程 并行 新生代采用复制算法
记录指令行
Object对象
创建AppClassLoader和ExtClassLoader,并将AppClassLoader的父加载器设置成ExtClassLoader,将ExtClassLoader的父加载器设置为null;
2bit
返回已经加载过的Class
01
字节码执行引擎
调用AppClassLoader中的loadClass方法进行数据安全校验,然后调用ClassLoader的loadClass方法
math=地址
直接内存
String name
GC分代收集算法
JNI本地接口方法
CMS收集器 多线程 并行、并发 老年代采用标记清除-整理算法。
操作数栈
classLoader.loadClass(\"com.lwp.jvm.Math\");
程序计数器
findLoadedClass()
Eden(8/10)
......
分代年龄
类元数据
launcher.getClassLoader()
指向互斥量(重量级锁的指针)
执行字节码
锁状态
父类加载器,加载失败后,由子加载器加载
老年代(2/3)
4bit
To(1/10)
调用loadClass加载要运行的的Math类
对象的hashcode
栈 -Xss
返回一个Launcher实例对象。
加载完成后,JVM会执行Math类里面的main方法
String()
地址指向Math对象
int age = 19
空
GC标记
重量级锁
静态变量
数组
常量
检测是否已经加载过该类。
ParNew收集器 多线程 并行 新生代采用复制算法 老年代采用标记整理算法
b=2
指向mian方法
没有加载过
加载Launcher.class的时候,会创建静态变量Launcher = new Launcher(),执行Launcher的构造函数
细节说明
25bit
launcher的实际及属性调用情况
findBootstrapClassOrNull(name)
加载class字节码
a=1
运行时数据区(内存模型)
Parallel Scavenge收集器 多线程 并行 新生代采用复制算法 JDK1.7 JDK1.8默认。
Serial Old收集器 单线程 并行 老年代采用标记-整理算法
java com.lwp.jvm.Math
Math()
本地方法栈
findClass(name);此方法是调用的URLClassLoader中的方法,因为子类继承了URLClassLoader,所以子类没有重写方法,默认调用直接父类的方法。
年轻代(1/3) -Xmn
垃圾回收器
C++调用JAVA代码,创建JVM启动器实例sum.misc.Launcher,该类由引导类加载器负责加载创建其他类加载器。具体执行代码是ClassLoader.getSystemClassLoader()
加载过
Math.name = 地址
对其填充Padding(保证对象是8个字节的整数倍)
指向栈中锁记录的指针
系统类加载器AppClassLoader
无锁态
G1收集器可处理年轻代,老年代G1将Java堆划分为多个大小相等的独立区域(region)JDK1.7+多线程并发、并行G1收集器在后台维护了一个优先列表,每次根据允许的手机时间,优先选择回收价值最大的Region老年代才用了复制算法。
创建一个引导类加载器实例(C++实现)
int svg = 10
Form(1/10)
初始化
C++调用
返回Launcher的loader属性(AppClassLoader实例)。
parent的层级关系:自定义类加载器->AppClassLoader->ExtClassLoader
方法区(元空间) -XX:MetaspaceSize;-XX:MaxMetaspaceSize
0 条评论
下一页