天天看点

JVM中GC详解

在Java面试过程中,JVM是必问项目。主要问题一般都是集中到JVM GC的类型和策略上。

今天主要谈到的是年轻代GC、老年代GC以及Minor GC、Major GC、Full GC之间的联系与区别。

JVM堆内存分为两部分:年轻代(Young Generation)和老年代(Old Generation)。

  • 年轻代:

    产生新对象。

    年轻代被分为3个部分:一个Eden区和两个Survivor区。当年轻代内存空间用完时,就会触发垃圾回收,这个垃圾回收称为Minor GC。

    在年轻代空间中,大部分新建的对象都位于Eden区当Eden区被对象填满时,就会执行Minor GC,并将所有存活下来的对象转移到某一个survivor区。

    Minor GC也会同样检查存活下来的对象,将他们移动到另一个survivor区。这样保证在一段时间内,总会存在一个空的survivor区。

    经过多次GC周期后,仍然存活的对象会被转移到老年代内存空间。通常是在年轻代提升到老年代通过设定年龄阈值来完成的。

  • 老年代:

    老年代内存中,包含长期存活的对象和经过多次GC仍然存活下来的对象。老年代的垃圾回收会在老年代内存占满时进行。

    老年代的垃圾回收称为Major GC,Major GC通常与Full GC是等价的,收集整个GC堆。

    Minor GC和Major GC其实就是年轻代GC和老年代GC的俗称。

    在Hotspot VM中,具体实现的收集器有:Serial GC、Parallel GC、CMS、G1 GC。大致可以对应到某个Young GC和Old GC算法组合。

  • 针对HotSpot VM的实现,其实GC的准确分类可以分为:

    分代GC

    Full GC

    及后续的G1分区收集其实本质是一个分代收集器,但是和之前其他各类回收器不同,它同时兼顾年轻代和老年代。

    分代GC并不GC整个堆的模式,而是专注分代收集:

    Young GC:只是年轻代的垃圾回收

    Old GC:只是老年代的垃圾回收(只有CMS的concurrent collection是这个模式)

    Mixed GC:整个年轻代以及部分老年代的垃圾回收(只有G1有这个模式)

    Full GC是针对整个新生代、老年代、元空间(metaspace,Java8以上版本取代perm gen)的全局范围的垃圾回收。

    带你对标阿里P6

    学习更多知识,可以扫码进群或关注公众号

    JVM中GC详解