zl程序教程

您现在的位置是:首页 >  后端

当前栏目

JVM 学习笔记(4):内存分配与回收策略

JVM内存笔记学习 策略 分配 回收
2023-06-13 09:12:58 时间

1、对象优先在 Eden 区分配

一般情况下,对象都优先在新生代的 Eden 区中分配,当 Eden 内存不足时将会发起一次 Minor GC。

2、大对象直接进入老年代

大对象指的是占用大量连续内存的 Java对象,例如长字符串、长数组等,这些大对象的内存分配可能会遭遇总空间充足但连续空间不足而无法分配的情况,或者在复制对象时产生高昂的成本,因此在 Serial 或者 ParNew 虚拟机中可以使用参数 -XX:PretenureSizeThreshold 来设置大对象的阈值,超过此值会直接进入老年代。

3、长期存活对象进入老年代

对于分代收集来说,判断对象进入老年代的依凭是对象的年龄,在对象头中会有标记对象年龄的计数器,对象每在 Survivor 区中熬过一次垃圾收集则年龄加一,当年龄达到阈值时会晋升如老年代中,可以通过参数 -XX:MaxTenuringThreshold 来设置年龄阈值。

4、动态对象年龄判定

为了适应内存实际情况,如果在 Survivor 中相同年龄所有对象大小的总和大于 Survivor 的一半,则大于或等于该年龄的对象可以直接进入老年代,无需达到阈值要求。

5、空间分配担保

在发生 Minor GC 之前,如果老年代连续空间大于新生代对象总大小 或者 历次新晋老的平均大小 时则会正常进行,否则会进行一次 Full GC。在这里老年代空间就是用来做 Survivor 的超额担保。

参考资料:•《深入理解Java虚拟机(第三版)》——周志明[1]

相关链接

[1] 《深入理解Java虚拟机(第三版)》——周志明: https://book.douban.com/subject/34907497/