JVM
2023-10-09 09:26:01 0 举报
知识点
作者其他创作
大纲/内容
64位:8字节指针压缩4字节所以32G压缩失效
java文件
s0
分代年龄的内存布局
控制器
操作数栈
hashcode,锁状态标记,分代年龄等
线程共享
Old够吗?
动态链接
1.堆中不存在该类的实例,该类被回收2.加载该类的calssLoader被回收时3.启动类加载器加载的类不会被卸载
对象头
线程私有
Young区
程序计数器Program Counter
Person.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器 -> 注解抽象语法树 -> 字节码生成器 -> Person.class文件
1.线程本地持有自己的PC,记录线程被CPU执行到的位置,线程切换时需要2.线程执行java方法,那么PC记录java字节码指令地址3.线程执行native方法,那么PC记录为空
JVM触发FullGC
开始Person person = new Person()新对象需要1M空间(根据对象内存布局计算)
Eden够吗?
old区
1.将二进制字节流阶段的<静态存储>结构,转换成方法区的运行时<数据结构>2.在堆中生成一个该类的java.lang.Class对象,作为访问方法区类信息的入口
1.验证Verify:验证是否符合Class文件格式规范如cafebabe等2.准备Prepare:半初始化(不含实例化属性)3.解析Resolve:虚拟机将常量池的符号引用替换成直接引用如类,接口,属性,类方法,接口方法
class文件
Java对象内存布局
false
创建对象成功(申请空间成功)
applicationLoader
方法区metaspace
占4字节
Java类加载器和运行时数据区
链接Link
使用Use
1.执行构造器的过程2.初始化的步骤a.类没有就加载和链接b.直接父类未初始化时,先初始化直接父类c.类中有初始化语句或代码块,则依次执行
局部变量表
Survivor区适合复制算法
非堆内存
装载Load
true
输出设备
Eden区
s1
Out Of Memory Error
虚拟机栈Java Virtual Machine Stack
栈帧
javac
G1的内存布局
字符串常量池:字符串作为最常用的数据类型,为减小内存的开销,专门为其开辟了一块内存区域
1.在survivor创建对象2.并将eden中部分活跃对象复制到survivor
实例数据
类加载之前的存储结构称作静态常量池, 加载到内存后称作运行时常量池
JVM内存模型(JMM)
1.执行native方法的时候用到本地方法栈2.线程方法中调用native时通过动态链接使用本地方法栈
注意:创建过程是询问各个空间是否存的下1M,存的下就开辟1M空间把person存进去
初始化Initialize
(图解看课件)类指针的实现方式:1.句柄池访问:使用句柄访问对象,会在堆中开辟一块内存作为句柄池,句柄中储存了对象实例数据的内存地址,访问类型数据的内存地址(类信息,方法类型信息),对象实例数据一般也在heap中开 辟,类型数据一般储存在方法区中。优点:reference存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为) 时只会改变句柄中的实例数据指针,而reference本身不需要改变。缺点 :增加了一次指针定位的时间开销。2.直接指针访问:直接指针访问方式指reference中直接储存对象在heap中的内存地址,但对应的类型数据访问地址需要 在实例中存储。优点:节省了一次指针定位的开销。缺点 :在对象被移动时(如进行GC后的内存重新排列),reference本身需要被修改
触发JVM产生minorGC回收eden不活跃的对象
ExtendLoader
存储器
填充对齐
本地方法栈Native Method Stack
一层层向上询问
线程共享区
虚拟机栈
一层层向下加载
ClassPointer
结束
卸载Unload
返回地址
bootLoader
java对象的生命周期
数组对象特有部分,记录数组长度
包含所有成员变量,不同类型变量占用空间大小:boolean和byte:1字节short和char:2字节int和float:4字节long和double:8字节reference引用:8字节(64位系统)(开启引用指针压缩占4字节)
Survivor够吗?
1.G1的各个区,是逻辑上的分区,并且每个区并不是固定的一种角色,回收后可能作为另一种分区使用2.G1的对象分配,引入TLAB策略TLAB:thread local allocation buffer3.栈上分配:考虑对象逃逸分析,方法栈或线程栈上分配注:栈上分配都是小对象
运行时数据区 Runtime Data Area
输入设备
MarkWord
ArrayLengrh
内部关系
CPU=运算器+控制器+存储器
1.在old创建对象2.并将survivor中部分活跃对象复制到old
64位:8字节
customLoader
栈帧信息
确保对象的大小是8字节的整数倍,不足填充。不是2的幂次倍
线程私有区
附加信息
堆Heap
1.主动引用:new,访问类静态属性或初始化,调用类静态方法,反射,初始化子类促使父类也初始化2.被动引用:引用父类静态属性促使父类初始化但子类不会,声明类数组不会初始化,引用类static final常量不会,引用只有static的常量会初始化
指向元数据区中,所属类的地址
类加载器,父类委托(双亲委派)
运算器
打破双亲委派:1.java.sql.Driver接口是有各自数据库厂商设计的,提供的SPI(service Provider Interface)就属于打破情况2.自定义类加载器重写loadClass方法
加载
0 条评论
回复 删除
下一页