[Java-jvm] 垃圾回收
2026年4月7日大约 2 分钟
[Java-jvm] 垃圾回收
JVM的垃圾回收机制
JVM的垃圾回收机制主要包括以下几个方面:
- 垃圾回收算法:JVM使用多种垃圾回收算法来管理内存,包括标记-清除、复制、标记-整理和分代收集等算法。
- 垃圾回收器:JVM提供了多种垃圾回收器,如Serial、Parallel、CMS和G1等,每种回收器适用于不同的应用场景。
- 垃圾回收的触发条件:垃圾回收通常在内存不足时触发,但也可以通过调用System.gc()来建议JVM进行垃圾回收。
重点-如何判断对象仍然存活?
可达性分析
通过一组名为“GC Roots”的对象作为起点,向下搜索,搜索所走过的路径称为引用链。
当一个对象到GC Roots没有任何引用链相连时,则说明此对象不可达,也就意味着此对象需要被回收。
哪些对象可以作为 GC Roots 呢?
- 虚拟机栈中引用的对象。
- 本地方法栈中引用的对象。
- 方法区中类静态属性引用的对象。
- 方法区中常量引用的对象。
- 所有被同步锁持有的对象。
- JNI引用的对象。
引用计数法
为每个对象维护一个引用计数器,记录引用次数。引用次数为0,对象就会被回收。
- 由于无法解决对象间循环引用问题,因此不被采用。
重点-垃圾回收算法有哪些?
标记-清除算法
标记-清除算法分为两个阶段:标记阶段和清除阶段。
标记阶段,标记所有需要回收的对象。
清除阶段,回收所有被标记的对象。
实现简单,但存在内存碎片问题。
复制算法
复制算法将内存分为两块,每次只使用其中的一块。当这一块内存用完时,将还存活的对象复制到另一块内存中,然后清空当前内存。
- 解决了内存碎片问题,但可用内存减少,且大对象的复制开销大。
标记-整理算法
标记-整理算法在标记阶段后,不直接清除对象,而是将所有存活的对象向一端移动,然后清除掉端边界以外的内存。
- 解决了内存碎片问题,但移动对象的开销较大。
核心-分代收集算法
分代收集算法,会根据对象存活周期将内存划分,通常分为新生代 和 老年代。
- 新生代采用复制,因为里面的大部分对象生命周期短;老年代采用标记-整理,因为里面的对象生命周期长。