- 对象分配是一个严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配的问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完是否会在内存空间中产生内存碎片。
新生代主要分为:Eden区和两个 Survio区 (下图的 S0 和 S1)
如上图:对象创建以后,先分配到 Eden 区,当Eden区放满了以后,开始垃圾回收(YGC/Minor GC),加入红色的对象不需要了,则进行释放,绿色的还有引用,则分配到 S0区(to区),然后对象的年龄计数器增加1。
Eden区继续存储对象,再次存储满了以后,进行YGC,无用对象被清除,绿色存在引用的对象和上面S0区的对象 统一都放入到 S1(to)区中,引用计数器增加1,然后S0 清空了,就这样反复.
当对象引用计数器的指达到15(默认的阈值位15),把这对象放入老年代。
s0和s1,复制之后有交换,谁空谁是to。
垃圾回收频繁在新生区收集,很少在养老区收集,几乎不在永久区/元空间收集。
注意:当 Eden 区满的时候,会触发 YGC 操作对 Eden和S0,S1进行GC操作,但是 Survio 满了不会触发 YGC。如果新声代放不下,可以考虑直接放到老年代,如果老年代也放不下了进行 FGC/Major GC,如果FGC以后还是放不下 报 OOM…
- Minor GC 、 Major GC 、Full GC 区别
JVM在进行 GC 时,并非每次都对 (新生代、老年代、永久代/元空间)进行一起回收,大多数还是对新生代GC。
针对 HotSpot VM的实现,它里面的GC按照回收区域,又分为两大类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)。