📜  Java中 JVM 垃圾收集器的类型及其实现细节(1)

📅  最后修改于: 2023-12-03 15:16:19.247000             🧑  作者: Mango

Java中JVM垃圾收集器的类型及其实现细节

Java中的垃圾收集器负责回收不再使用的内存,以避免内存泄漏和程序崩溃。下面介绍Java中常见的垃圾收集器类型及其实现细节。

垃圾收集器类型
Serial收集器

Serial收集器是最简单的垃圾收集器,它是单线程、采用标记-清除算法的收集器。在垃圾收集的过程中,会暂停所有用户线程,可能会造成较长的停顿时间。Serial收集器适合小内存的应用,或者是客户端应用。

Parallel收集器

Parallel收集器是Serial收集器的多线程版本,也采用标记-清除算法,但可以通过使用多个线程使垃圾收集的速度提升。它适用于多核和多处理器的环境中,并可以通过调整参数来控制停顿时间。

CMS收集器

CMS收集器采用标记-清除算法,但是在标记和清除阶段都尽可能地利用多线程来完成,从而减少了停顿时间。CMS收集器适合对停顿时间要求较高的应用,但是它会对CPU的使用产生较大的影响。

G1收集器

G1收集器是一款基于“分代收集”概念的、面向大堆的垃圾收集器。它采用多线程并发标记-清除算法,能够在不影响整体吞吐量的情况下,保证垃圾收集的时间可控。G1收集器适合大内存应用和对垃圾回收时间有较高要求的应用。

垃圾收集器实现细节
垃圾收集算法
  • 标记-清除算法:遍历所有对象,标记出所有需要被回收的对象,并标记它们的对象头,然后在清除阶段将所有被标记的对象回收。
  • 标记-复制算法:将存活的对象复制到一块新的内存空间,然后将原来的内存空间全部回收。
  • 标记-整理算法:标记出所有需要被回收的对象,并进行整理,将所有存活的对象整理成连续的内存块,再将空闲的内存块回收。
垃圾收集参数
  • -Xmx:设置最大堆内存大小
  • -Xms:设置初始堆内存大小
  • -Xmn:设置新生代堆内存大小
  • -XX:SurvivorRatio:设置新生代的Eden区与Survivor区的比例
  • -XX:MaxTenuringThreshold:设置对象进入老年代的年龄阈值
GC日志分析

通过GC日志可以了解到垃圾收集器的工作情况,包括GC时间、GC次数、GC时停顿时间、堆大小等信息。可以通过以下命令开启GC日志:

-Xloggc:gc.log
-XX:+PrintGCDetails

其中,-Xloggc指定日志文件路径,-XX:+PrintGCDetails开启详细日志输出。