4. 内存分配和回收策略

JVM分代垃圾回收策略的基础概念

为什么要分代(新生代,老年代,永久代)

4. 内存分配和回收策略

1. 新生代

所有新生成的对象首先都是放在新生代的。新生代的目标就是尽可能快速的收集掉那些生命周期短的对象

  • 新生代有划分为Eden、From Survivor和To Survivor三个部分, 为对象分配内存的时候,首先使用Eden空间
  • 经过GC后,没有被回收的会首先进入From Survivor区域,任何时候,都会保持一个Survivor区域完全空闲
  • From Survivor和To Survivor两个区域会根据GC的实际情况,进行互换,将From Survivor区域中的对象全部复制到To Survivor区域中

2. 老年代

在新生代的 survivor 区域中经历一定次数的Minor Gc之后仍然存活的对象,会放到老年代汇中

此外就是一些大对象,比如数据量较大的数组和集合

在虚拟机中可以设置超过内存限制的对象直接放到老年代,避免这种大对象进入到新生代在Eden 和 survivor区之间发生大对象复制

3. 永久代

jvm 中的方法区,用来存储类信息、静态变量、常量等信息,一般不会gc

内存分配和回收策略

1. 对象优先在Eden分配

对象先在新生代分配,新生代没有足够的空间分配时,虚拟机进行一次Minor GC

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

占用内存很大的字符串以及数组,如果放到新生代,容易出现内存还有很多空间就触发GC来清理出连续的空间存储大对象,并且也避免了大对象在新生代进行复制操作

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

指在survivor区存活过一次GC 年龄就会 +1, 当达到默认的 15岁时,就会进入老年代

4. 动态对象年龄判定

如果survivor区中的相同年龄的所有对象大小总和大于等于survivor空间的一半,那么大于等于这个年龄的所有对象进入老年代

5. 空间分配担保

在Minor Gc之前,老年代都会判断一下连续的空闲区域或者历次进入老年代对象的大小总和的平均数是否大于新生代所有对象的总和
,如果大于则进行 Minor Gc,否则进行 Full Gc
4. 内存分配和回收策略