Java7 及之前堆内存逻辑上分为三部分:新生区+养老区+永久区
Young Generation Space 新生区 ,又被划分为Eden区和Survivor区Old generation space 养老区 Permanent Space 永久区 Java 8及之后堆内存逻辑上分为三部分:新生区+养老区+元空间
Young Generation Space 新生区,又被划分为Eden区和Survivor区Old generation space 养老区meta Space 元空间 meta
约定:新生区 <–> 新生代 <–> 年轻代 、 养老区 <–> 老年区 <–> 老年代、 永久区 <–> 永久代
对象分配过程:
new的对象先放Eden区。当Eden区的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对Eden区进行垃圾回收(MinorGC),将Eden区中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到Eden区。将Eden中的未被回收的对象移动到Survivor 0区。如果再次触发垃圾回收机制,Survivor 0区中未被回收的对象,就会放到Survivor 1区。如果再次触发垃圾回收机制,Survivor 1区中未被回收的对象会移回Survivor 0区,如此反复。通过设置反复次数(默认是15次)控制,当反复次数到达所设置的值时Survivor区中仍未被回收的对象将被移到养老区。设置 JVM 参数:**-XX:MaxTenuringThreshold**=N 当养老区内存不足时,触发GC:Major GC,进行养老区的内存清理若养老区执行了Major GC之后,发现依然无法进行对象的保存,就会产生OOM异常。
对象分配的特殊情况:
如果来了一个新对象,先看看 Eden 是否放的下?
如果 Eden 放得下,则直接放到 Eden 区如果 Eden 放不下,则触发 YGC ,执行垃圾回收,看看还能不能放下?将对象放到养老区又有两种情况:
如果 Eden 执行了 YGC 还是无法放不下该对象,说明是超大对象,只能直接放到养老区养老区也放不下,则先触发FullGC ,如果还是放不下,就报 OOM如果 Eden 区满了,将对象往Survivor区拷贝时,Survivor也放不下,就让新对象直接晋升至养老区
GC分类:
JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。针对Hotspot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(FullGC)
部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:
新生代收集(Minor GC/Young GC):只是新生代(Eden,s0,s1)的垃圾收集老年代收集(Major GC/Old GC):只是老年代的圾收集。目前,只有CMS GC会有单独收集老年代的行为。注意,很多时候Major GC会和Full GC混淆使用,需要具体分辨是老年代回收还是整堆回收。混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集。目前,只有G1 GC会有这种行为
整堆收集(Full GC):收集整个java堆和方法区的垃圾收集。



