在 JDK 8 中,手动调优 G1 垃圾收集器可以通过以下步骤和参数进行:
1. 启用 G1 垃圾收集器
要启用 G1 垃圾收集器,需要在 JVM 启动参数中添加以下选项:
-XX:+UseG1GC
这个参数告诉 JVM 使用 G1 作为垃圾收集器。
2. 设置堆内存大小
合理设置堆内存的初始大小和最大大小,可以使用以下参数:
-Xms4g -Xmx4g
这将设置初始堆大小和最大堆大小均为 4GB。
3. 设置最大 GC 暂停时间
G1 收集器的一个重要特点是低暂停时间,可以通过以下参数设置期望的最大 GC 暂停时间:
-XX:MaxGCPauseMillis=200
这个参数设置 G1 收集器在进行垃圾回收时,尽量将暂停时间控制在 200 毫秒以内。
4. 设置堆使用率阈值
G1 收集器会在堆使用率达到一定阈值时开始垃圾回收,可以通过以下参数设置这个阈值:
-XX:InitiatingHeapOccupancyPercent=45
这个参数表示当堆使用率达到 45% 时,G1 收集器会开始并发标记周期。
5. 设置 Region 大小
G1 收集器将堆内存划分为多个 Region,可以通过以下参数设置每个 Region 的大小:
-XX:G1HeapRegionSize=32m
这个参数设置每个 Region 的大小为 32MB。
6. 设置并发标记线程数
G1 收集器在并发标记阶段使用的线程数可以通过以下参数设置:
-XX:ConcGCThreads=4
这个参数设置并发标记线程数为 4。
7. 设置并行回收线程数
G1 收集器在并行回收阶段使用的线程数可以通过以下参数设置:
-XX:ParallelGCThreads=8
这个参数设置并行回收线程数为 8。
8. 其他常用参数
-
禁用显式 GC 调用:可以通过以下参数禁用
System.gc()
的显式调用,避免可能的性能问题:-XX:+DisableExplicitGC
-
启用字符串去重:可以通过以下参数启用 JVM 的字符串去重功能,减少堆内存的占用:
-XX:+UseStringDeduplication
示例配置
以下是一个完整的示例配置,适用于一个具有 8 核心和 32GB 内存的机器:
java -XX:+UseG1GC -Xms16g -Xmx16g -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:G1HeapRegionSize=32m -XX:ConcGCThreads=4 -XX:ParallelGCThreads=8 -XX:+UseStringDeduplication -XX:+DisableExplicitGC -jar your-application.jar
监控和调优
-
使用监控工具:可以使用
jstat
、jmap
、jconsole
等工具监控 G1 收集器的性能。 -
分析 GC 日志:可以通过以下参数启用 GC 日志记录,并分析日志以发现性能瓶颈:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/yourapp-gc.log
通过以上步骤和参数,可以在 JDK 8 中手动调优 G1 垃圾收集器,以满足应用的性能需求。