在Java虚拟机(JVM)中,垃圾回收(GC)是内存管理的重要组成部分,其主要目的是回收不再使用的对象,释放内存空间。JVM的堆内存通常被划分为新生代(Young Generation)和老年代(Old Generation),两者的垃圾回收过程和策略有所不同。
青年代(新生代)的垃圾回收过程
新生代是存放新创建对象的区域,通常分为三个部分:Eden区和两个Survivor区(From和To)。新生代的垃圾回收过程如下:
- 对象分配:新创建的对象首先被分配到Eden区。
- 触发条件:当Eden区满时,触发Minor GC。
- 垃圾回收算法:新生代的垃圾回收通常采用复制算法。在Minor GC过程中,会将Eden区和当前From Survivor区中存活的对象复制到To Survivor区,然后清空Eden区和From Survivor区。
- 对象晋升:经过多次Minor GC后,仍然存活的对象会被晋升到老年代。
老年代的垃圾回收过程
老年代用于存放经过多次垃圾回收后仍然存活的对象,其垃圾回收过程相对复杂:
- 触发条件:
-
- 当老年代空间不足时,会触发Major GC。
- 在某些情况下,如Minor GC后剩余对象太多放入老年代内存都不够,也会触发Major GC。
- 垃圾回收算法:老年代的垃圾回收通常采用标记-整理算法。该算法分为两个阶段:
-
- 标记阶段:标记出所有存活的对象。
- 整理阶段:将存活的对象移动到内存的一端,以确保内存空间的连续性,然后清除边界以外的内存。
- 并发与增量回收:某些垃圾回收器(如G1)会采用并发和增量回收的方式,以减少全局停顿时间。例如,G1会在跟踪存活对象后,增量式地从老年代回收内存。
总结
- 新生代:主要采用复制算法,回收速度快,频率高,适合生命周期短的对象。
- 老年代:主要采用标记-整理算法,回收速度相对较慢,频率低,适合生命周期长的对象。
不同的垃圾回收器(如Serial、Parallel、CMS、G1等)在实现上述算法时会有一些差异,可以根据具体的应用场景选择合适的垃圾回收器。