JAVA GC 垃圾回收器

December 18, 2023 作者: yijianhao 分类: java 浏览: 64 评论: 0

JAVA 垃圾回收器

常见的回收器

1. Serial GC

  • 版本: JDK 1.3及以上

  • 用法: -XX:+UseSerialGC

  • 特点: 单线程执行,适用于小型数据处理和有限资源的环境。

2. Parallel GC (Throughput Collector)

  • 版本: JDK 1.4及以上

  • 用法: -XX:+UseParallelGC

  • 特点: 多线程执行,注重吞吐量,适用于多核服务器。

3. Concurrent Mark-Sweep (CMS) GC

  • 版本: JDK 1.4.2及以上

  • 用法: -XX:+UseConcMarkSweepGC

  • 特点: 较低的停顿时间,适用于需要较短GC停顿时间的应用场景。不过,CMS GC在JDK 9中被标记为废弃,可能在未来版本中被移除。

4. Garbage-First (G1) GC

  • 版本: JDK 7 update 4及以上,作为实验特性加入;JDK 9中成为默认GC。

  • 用法: -XX:+UseG1GC

  • 特点: 分区堆,平衡吞吐量和停顿时间,适用于大堆内存。

5. ZGC (Z Garbage Collector)

  • 版本: 作为实验特性在JDK 11中引入

  • 用法: -XX:+UseZGC

  • 特点: 目标是达到极低的停顿时间,适用于多核机器和大内存应用。

6. Shenandoah GC

  • 版本: 作为实验特性在JDK 12中引入

  • 用法: -XX:+UseShenandoahGC

  • 特点: 低停顿时间,独立于堆的大小。

7. Epsilon GC (No-Op Collector)

  • 版本: 作为实验特性在JDK 11中引入

  • 用法: -XX:+UseEpsilonGC

  • 特点: 实验性的GC,不进行任何垃圾回收,可用于性能测试。使用完堆内存,jvm就会停止运行。

默认使用的垃圾回收器

  • JDK 8及以前: 默认情况下,Java使用Parallel GC作为默认垃圾回收器。

  • JDK 9+: 从JDK 9开始,默认垃圾回收器变更为G1 GC(Garbage-First Garbage Collector)。G1 GC旨在提供一个平衡良好的垃圾回收性能,特别是对于具有较大堆内存的多核机器。

如何查看当前java使用了什么垃圾回收器?

输入java -XX:+PrintCommandLineFlags -version 会出现一些jvm参数,例如:

➜  ~ java -XX:+PrintCommandLineFlags -version
-XX:ConcGCThreads=3 -XX:G1ConcRefinementThreads=10 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=128600448 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=2057607168 -XX:MinHeapSize=6815736 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC
openjdk version "17.0.9" 2023-10-17
OpenJDK Runtime Environment (build 17.0.9+8)
OpenJDK 64-Bit Server VM (build 17.0.9+8, mixed mode)

其中-XX:+UseG1GC 就是指当前默认使用的是G1回收器

如果想看到当前正在运行的java进程使用了哪些回收器,可以使用jinfo:

> jps  # jps命令快速查看当前Java进程PID
70100 RemoteMavenServer36
70836
72196 Jps
72596 MainApp
72504 Launcher

> jinfo -flags 72596 
VM Flags:
-XX:CICompilerCount=4 -XX:InitialHeapSize=266338304 -XX:MaxHeapSize=4246732800 -XX:MaxNewSize=1415577600 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=88604672 -XX:OldSize=177733632 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

其中的-XX:+UseParallelGC 就是说明使用了ParallelGC

有关于垃圾回收器的java启动参数

其实不同的JVM参数会有所不同,但是主要是HotSpot为主

通用参数

  • -Xms<size>: 设置堆的初始大小。

  • -Xmx<size>: 设置堆的最大大小。

  • -Xmn<size>: 设置年轻代大小(对于使用ParNew和Parallel GC的情况)。

  • -XX:NewRatio=<ratio>: 设置年轻代(包括Eden和两个Survivor空间)和老年代的比例。

  • -XX:SurvivorRatio=<ratio>: 设置Eden区与一个Survivor区的大小比例。

  • -XX:MaxTenuringThreshold=<value>: 设置对象晋升到老年代的年龄阈值。

  • -XX:+UseCompressedOops: 启用指针压缩。

  • -XX:+HeapDumpOnOutOfMemoryError: 在内存溢出时导出堆到文件。

  • -XX:HeapDumpPath=<path>: 设置堆转储文件的路径。

与GC日志参数有关的(JDK 8及之前,JDK8之后被标记为过期)

  • -Xloggc:<file-path>: 将GC日志输出到指定文件。

  • -XX:+PrintGCDetails: 在GC日志中打印详细信息。

  • -XX:+PrintGCDateStamps: 在GC日志中添加日期戳。

  • -XX:+PrintGCTimeStamps: 在GC日志中添加时间戳。

与GC日志参数有关的(JDK 9及之后)

  • -Xlog:gc: 启用GC日志,默认输出到标准输出(控制台)。

  • -Xlog:gc*: 启用所有GC相关的日志消息。

  • -Xlog:gc:/path/to/gc.log: 将GC日志输出到指定文件。

  • -Xlog:gc:file=gc.log:time,level,tags: 输出GC日志到文件,包括时间戳、日志级别和标签。

  • -Xlog:gc+heap=debug: 启用GC和堆调试信息的输出。

与Parallel GC有关的

  • -XX:+UseParallelGC: 启用并行垃圾收集器。

  • -XX:ParallelGCThreads=<number>: 设置并行垃圾收集器的线程数。

  • -XX:+UseParallelOldGC: 使用并行方式执行老年代垃圾回收。

与CMS GC有关的

  • -XX:+UseConcMarkSweepGC: 启用CMS垃圾收集器。

  • -XX:+UseCMSInitiatingOccupancyOnly: 只在达到阈值时启动CMS收集。

  • -XX:CMSInitiatingOccupancyFraction=<percentage>: 设置启动CMS收集的堆占用率阈值。

与G1 GC有关的

  • -XX:+UseG1GC: 启用G1垃圾收集器。

  • -XX:MaxGCPauseMillis=<milliseconds>: 期望的最大GC暂停时间。

  • -XX:G1HeapRegionSize=<size>: 设置G1的堆区域大小。

  • -XX:InitiatingHeapOccupancyPercent=<percentage>: 启动并发GC循环的堆占用率阈值。

与ZGC有关的

  • -XX:+UseZGC: 启用ZGC垃圾收集器。

HotSpot


评论