JVM 内存模型V2
2021-10-08 14:12:09 0 举报
JVM 内存模型详解
作者其他创作
大纲/内容
对象首先 分配在 eden 区
虚拟机栈
概念新生代收集(Minor GC/Young GC):指目标只是新生代的垃圾收集老年代收集(Major GC/Old GC):指目标只是老年代的 GC,目前只有 CMS 有单独收集老年代的行为。注意:Major GC 还可能指为整堆 GC(需要根据上下文判断)Mixed GC:指目标是收集整个新生代以及部分老年代的垃圾收集(目前只有 G1 有这种行为)Full GC:收集整个 Java 堆和方法区的垃圾收集
TO
数组长度
存储内容
标志位
状态
情况一
对象哈希码、对象分代年龄
01
未锁定
情况二
指向锁记录的指针
00
轻量级锁定
情况三
指向重量级锁的指针
10
膨胀(重量级锁定)
情况四
空,不需要的记录信息
11
GC 标记
情况五
偏向线程 ID、偏向时间戳、对象分代年龄
可偏向
类型指针(对象指向它的类型元数据的指针)
实例数据(不确定大小)
执行引擎
其他信息
动态连接
方法出口
·······
对齐填充(若对象头和实例数据相加不为 8 的倍数则使用该部分补齐)
操作数栈
b 实例引用
public class A { private final String Aname = \"xiaoming\";}public class B extends A{ private String Bname = \"xiaohua\"; private int Bcount; public static void main(String[] args) { B b = new B(); long l = 1L; double d = 1.0; int count = 0; }}
新生代
堆
xiaohua
0
元空间(方法区实现)
本地方法库
老年代
CMS 特有参数-XX:CMSInitiatingOccupancyFraction 设置 CMS 收集器在老年代被使用多少后触发垃圾收集,默认值时 68%-XX:+UseCMSCompactAtFullCollection 设置 CMS 在完成垃圾收集后进行内存碎片整理(JDK9 废弃)-XX:CMSFullGCsBeforeCompaction 设置 CMS 在进行若干次垃圾收集后启动一次内存整理(JDK9 废弃)
运行时数据区
操作数栈数据流
1
本地方法栈
对象头(8 字节的倍数)
A 的对象类型数据
-XX:+/-UserTLAB 虚拟机是否使用 TLAB-Xmx 堆空间最大大小-Xms 堆空间最小大小-XX:+HeapDumpOnOutOfMemoryError 内存出现异常 Dump 内存堆快照
父类实例数据:Aname
局部变量表
B 的对象类型数据
内存分配方法:指针碰撞(内存连续)、空闲列表(内存不连续)内存分配线程安全:同步处理(CAS)、按照线程划分不同的空间(TLAB)
程序计数器
下一条需要执行的字节码指令
-XX:MaxMetaspaceSize 设置元空间最大值,默认是 -1,即只受本地内存大小-XX:MetaspaceSize 指定元空间的初始空间大小,字节单位,达到设定值会触发垃圾收集进行类型卸载-XX:MinMetaspaceFreeRatio 在垃圾收集之后控制最小的元空间剩余容量的百分比-XX:MaxMetaspaceFreeRatio 控制最大的元空间剩余容量的百分比
Eden 区
Parallel Scavenge 特有参数-XX:MaxGCPauserMillis 设置 GC 最大停顿时间-XX:GCTimeRatio GC时间占总时间的比率,默认 99,即允许 GC 1% 的 GC 时间
······
FROM
收集器
特点
算法
Serial
单线程
复制算法
ParNew
Serial 的多线程版
Parallel Scavenge
高吞吐量
G1 特有参数-XX:G1HeapRegionSize=n 设置 Region 大小-XX:MaxGCPauseMillis 设置 G1 收集过程目标时间,默认值时 200ms-XX:G1NewSizePercent 新生代最小值,默认值是 5%-XX:G1MaxNewSizePercent 新生代最大值,默认值时 60%
各区域参数
当对象分代年龄超过阀值时,会晋升到老年代,阀值为 15
本地库接口
子类实例数据:Bcount
存储顺序收虚拟机分配策略参数(-XX:FeildsAllocationStyle参数和字段定义顺序印象)默认分配顺序:longs/doubles、ints、shorts/chars、bytes/booleans、oopsHotSpot 虚拟机的 +XX: CompactFields 参数为 true(默认),那子类中较窄的变量也允许插入父类变量的空隙之间
栈帧(main)
参数配置-XX:SurvivorRatio 新生代中 Eden 区域与 Survivor 区域的容量比,默认值 8,表示 Eden:Survivor=8:1-XX:PretenureSizeThreshold 直接晋升到老年代对象的大小-XX:MaxTenuringThreshold 晋升到老年代的年龄-XX:UseAdaptieSizePolicy 动态调整 Java 堆中各个区域大小以及进入老年代的年龄-XX:HandlePromotionFailure 是否允许分配担保失败-XX:ParallelGCThreads 设置并行 GC 时进行内存回收的线程数
HotSpot 要求自动内存管理系统要求对象的起始地址必须是 8 字节的整数倍,意味着任何对象的大小必须是 8 字节的整数倍
double、long 占用 2 个 slot
xiaoming
B 实例
-Xss 设备线程最大栈空间
b
l
d
count
子类实例数据:Bname
收集器选择-XX:+UseSerialGC Client 模式下的默认值,使用 Serial + Serial Old 的收集器组合进行内存回收-XX:+UseParNewGC 使用 ParNew + Serial Old 的收集器组合进行内存回收,JDK9 不在支持-XX:+UseConcMarkSweepGC 使用 ParNew + CMS + Serial Old收集组合进行内存回收,Serial Old 作为 CMS 出现 Concurrent Mode Failure 失败后的备用收集器-XX:+UseParallelGC JDK9 之前 Server 模式默认值,使用 Parallel Scavenge + Serial Old 收集器的组合进行内存回收-XX:+UseParallelOldGC 使用 Parallel Scavenge + Parallel Old 收集器组合进行内存回收-XX:+UseG1GC JDK9 后 Server 模式默认值,使用 G1 收集器-XX:+UseShenandoahGC 使用 Shenandoah GC,需要配合 -XX:UnloclExperimentalVMOptions 使用-XX:+UseZGC 使用 ZGC,需要配合 -XX:UnloclExperimentalVMOptions 使用
GC 参数
Serial Old
整理算法
CMS
低延迟
清除算法
Parallel Scavenge Old
eden 区空间不足时,触发 minor GC,将 eden 区 和 FROM 区的存活对象复制 到 TO 区,对象分代年龄 +1,再交换 FROM 和 TO。
-XX:MaxDirectMemorySize 指定直接内存容量,若不指定则默认与 Java 堆最大值一致
直接内存
运行时常量池
收藏
收藏
0 条评论
下一页