JVM垃圾回收模型
JVM组成
堆内存
堆内存的结构,主要分为新生代(伊甸园区,Survivor的from区,Survivor的to区),以及老年代。
一、新生代
1.伊甸园区
是大部分对象被创建在此区域。
2.Survivor的from区(随意挑选一个成为from区)
当伊甸园区存满后触发Minor GC,没有被回收的对象将进入该区域等待下次的回收。
3.Survivor的to区
将 Eden 中存活下来的对象和 from 区域的对象,拷贝到这个“to”区域,防止内存碎片化。进一步清理无用对象
二、老年代
放置长生命周期的对象,通常都是从 Survivor 区域拷贝过来的对象。当然,也有特殊情况,我们知道普通的对象会被分配在 TLAB 上;如果对象较大,JVM 会试图直接分配在 Eden 其他位置上;如果对象太大,超过Survivor的50%,完全无法在新生代找到足够长的连续空闲空间,JVM 就会直接分配到老年代。
堆的组成比例
正常来讲的分配是新生代和老年代的比例1:2,
新生代中的伊甸园区,Sursuvivor的from区,Survivor的to区的比例是8:1:1,这一点需要谨记,因为当发生对象过大时触发了内存溢出,除了加大堆内存的容量之外,有时还要估算对象大小,看其是否因为超过了Sursuvivor区的50%而导致直接被存入老年代,使得老年代被占满触发FullGC,当频繁触发FullGC导致STW时,会报出内存溢出异常。