当一个新对象创建时,首先会来到新生区的Eden区中,这里进行
第一次判断
:判断当前新对象是否可以再Eden区放得下,如果放下我们直接放到Eden区分配内存即可;如果放不下时,就要进行一次Minor GC
。此次GC我们展开来详细说一下:==回收时进行第二次判断
:判断Survivor0是否放得下,如果放得下Eden 区存活对象复制到一个 Survivor0 区,然后清空 Eden 区,当这个 Survivor0 区也存放满了时,则将 Eden 区和 Survivor0 区存活对象复制到另一个 Survivor1 区,然后清空 Eden 和这个 Survivor0 区,此时 Survivor0 区是空的,然后将 Survivor0 区和 Survivor1 区交换,即保持 Survivor1 区为空, 如此往复(对照上面两个区域来回切换)。当对象在 Survivor 区躲过一次 GC 的话,其对象年龄便会加 1,此时进行第三次判断
:判断年龄是否达到阈值,默认情况下,如果对象年龄达到 15 岁。超过就会移动到老年代中。不超则继续在Survivor。(对照上图虚线框)==
执行完Minor GC
后,进行第四次判断
:判断Eden区是否放得下,如果放得下就进行内存分配,如果放不下默认作为大对象放到老年区
。此时进行第五次判断
新对象是否在老年区放得下,如果放得下就进行内存分配;如果放不下则进行一次Major GC 即 Full GC(执行时间为Minor GC的10倍多)
,最后进行第五次判断
:判断老年区是否放得下,如果放得下进行内存分配;放不下则直接报异常OOM
,此时需要改变堆的内存大小了。