垃圾回收机制(Garbage Collection,简称GC)是Java虚拟机(JVM)自动管理内存的一种机制,用于回收不再被程序使用的对象所占用的内存空间。垃圾回收机制的存在大大减轻了程序员手动管理内存的负担,并提高了内存利用率。
垃圾回收机制的工作原理
-
对象分配:当我们在Java程序中创建一个对象时,内存会被分配给该对象。这些对象通常存储在堆(Heap)内存中。
-
标记-清除(Mark-Sweep):
- 标记阶段:垃圾回收器首先会标记出所有仍然被程序引用的对象。这些对象被认为是“可达”的,不能被回收。
- 清除阶段:垃圾回收器会清除所有未被标记的对象,释放它们占用的内存。
-
复制(Copying):
- 将堆内存分为两个相等的区域:一个用于分配新对象,另一个用于存放仍在使用的对象。
- 当需要执行垃圾回收时,垃圾回收器会复制当前使用的区域到另一个区域,并清空原来的区域。
-
标记-整理(Mark-Compact):
- 标记阶段:与标记-清除类似,垃圾回收器会标记出所有仍然被程序引用的对象。
- 整理阶段:垃圾回收器会将所有未被标记的对象向内存的一端移动,从而清理出连续的空闲内存。
-
分代收集(Generational Collection):
- 新生代(Young Generation):新创建的对象首先被分配到新生代。新生代又分为Eden区和两个Survivor区(通常为From和To)。
- 对象在Eden区创建,经过一次Minor GC后,仍然存活的对象会被移动到Survivor区。
- Survivor区也会随着对象的存活时间增加而被晋升到老年代(Old Generation)。
- 老年代(Old Generation):存活时间较长的对象会被放入老年代。当老年代空间不足时,会触发Major GC或Full GC。
- 新生代(Young Generation):新创建的对象首先被分配到新生代。新生代又分为Eden区和两个Survivor区(通常为From和To)。
-
并发标记清除(Concurrent Mark-Sweep,CMS):
- CMS是一种以获取最短回收停顿时间为目标的收集器。
- 在进行CMS回收时,暂停的时间较短,可以更快速地执行垃圾回收。
-
G1垃圾收集器(G1 Garbage Collector):
- G1是一种面向服务端应用的垃圾回收器,适用于多核处理器和大内存堆。
- 将整个堆内存划分为多个独立的块(Region),可以并行地进行垃圾回收。
- 能够在不需要“Stop-The-World”的情况下进行部分回收,减少了停顿时间。
垃圾回收器类型
- Serial收集器:单线程收集器,进行垃圾回收时暂停整个JVM。
- Parallel收集器:多线程收集器,利用多核处理器提高垃圾回收效率。
- CMS收集器:并发标记清除收集器,减少停顿时间,但可能会产生“Concurrent Mode Failure”。
- G1收集器:适用于大内存多处理器服务器,能够在不停机的情况下进行垃圾回收。
- ZGC收集器:低延迟收集器,适用于超大内存(TB级别),停顿时间不超过10ms。
调优建议
- 选择合适的垃圾回收器:根据应用的需求选择合适的垃圾回收器。例如,对于低延迟应用可以选择ZGC或Shenandoah。
- 调整堆内存大小:合理设置堆内存大小(
-Xmx
和-Xms
),避免频繁的Full GC。 - 监控和分析:使用工具(如JVisualVM、JConsole、GC日志)监控垃圾回收情况,分析GC日志以进行调优。
通过理解垃圾回收机制及其工作原理,可以更好地进行Java应用的性能优化和调优。