G1 垃圾收集器
-XX:ActiveProcessorCount=16 -XX:-UseContainerSupport -Xss512k -Xmx18g -Xms18g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:ReservedCodeCacheSize=240m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:InitiatingHeapOccupancyPercent=40 -XX:MaxGCPauseMillis=100 -XX:+TieredCompilation -XX:CICompilerCount=4 -XX:-UseBiasedLocking -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintAdaptiveSizePolicy -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintStringTableStatistics -XX:+PrintTenuringDistribution -Xloggc:/opt/logs/query/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=30 -XX:GCLogFileSize=50M -XX:+PrintFlagsFinal -XX:G1HeapWastePercent=15 -XX:ConcGCThreads=4 -XX:ErrorFile=/opt/logs/query/vmerr.log -XX:HeapDumpPath=/opt/logs/query/HeapDump -jar ./query-server.jar
每个配置的含义
JVM参数的含义:
-
-XX:ActiveProcessorCount=16
:设置JVM可见的处理器数量为16。这对于在容器环境或需要限制JVM使用CPU核心数的场景中很有用。 -
-XX:-UseContainerSupport
:禁用容器支持。JVM在容器环境中默认会启用容器支持来适应容器的资源限制。 -
-Xss512k
:设置每个线程的堆栈大小为512KB。 -
-Xmx18g
:设置JVM最大堆内存为18GB。 -
-Xms18g
:设置JVM初始堆内存为18GB,与最大堆内存相同,可以减少堆扩展时的性能开销。 -
-XX:MetaspaceSize=512m
:设置元空间的初始大小为512MB。元空间用于存放类元数据。 -
-XX:MaxMetaspaceSize=512m
:设置元空间的最大大小为512MB。 -
-XX:ReservedCodeCacheSize=240m
:为即时编译的代码分配240MB的代码缓存空间。 -
-XX:+HeapDumpOnOutOfMemoryError
:在发生内存溢出时自动生成堆转储文件。 -
-XX:+UseG1GC
:使用G1垃圾收集器。 -
-XX:G1HeapRegionSize=8M
:设置G1垃圾收集器中每个Region的大小为8MB。 -
-XX:InitiatingHeapOccupancyPercent=40
:设置堆使用率达到40%时开始并发GC周期。 -
-XX:MaxGCPauseMillis=100
:设置期望的最大GC停顿时间为100毫秒。 -
-XX:+TieredCompilation
:启用分层编译,这可以在程序运行时根据代码的热度来选择不同的编译级别,以优化性能。 -
-XX:CICompilerCount=4
:设置即时编译器的线程数为4。 -
-XX:-UseBiasedLocking
:禁用偏向锁。偏向锁可以提高同步代码的执行效率,但在某些应用场景下可能不适用。 -
-XX:+PrintGCDetails
、-XX:+PrintGCDateStamps
、-XX:+PrintGCTimeStamps
、-XX:+PrintAdaptiveSizePolicy
、-XX:+PrintGCApplicationStoppedTime
、-XX:+PrintHeapAtGC
、-XX:+PrintStringTableStatistics
、-XX:+PrintTenuringDistribution
:这些参数用于开启不同的GC日志打印选项,帮助分析GC行为和性能。 -
-Xloggc:/opt/logs/query/gc.log
:指定GC日志的输出路径。 -
-XX:+UseGCLogFileRotation
、-XX:NumberOfGCLogFiles=30
、-XX:GCLogFileSize=50M
:启用GC日志文件的轮转,设置最多保留30个日志文件,每个文件的最大大小为50MB。 -
-XX:+PrintFlagsFinal
:打印所有JVM参数的最终值。 -
-XX:G1HeapWastePercent=15
:设置G1垃圾收集器在回收时可以容忍的堆内存浪费比例为15%。 -
-XX:ConcGCThreads=4
:设置并发GC时使用的线程数为4。 -
-XX:ErrorFile=/opt/logs/query/vmerr.log
:指定虚拟机错误日志(如JVM崩溃时的hs_err_pid日志)的输出路径。 -
-XX:HeapDumpPath=/opt/logs/query/HeapDump
:指定堆转储文件的输出路径。 -
-jar ./query-server.jar
:指定要运行的jar包。
总是报jvm.gc.time>1000
给定的G1垃圾收集器配置中,有几个关键参数可能与jvm.gc.time>1000
(GC时间超过1000毫秒)的问题相关。我们将逐一分析这些参数,探讨可能的原因、定位方法和解决方案。
可能的原因
针对高并发、高可用、高性能(三高)服务,降低jvm.gc.time
时间、改善服务的tp999耗时,并提高系统性能,可以从以下几个方面进行优化:
1. JVM参数调整
-
调整
-XX:MaxGCPauseMillis
:当前设置为100毫秒,这个目标可能过于严格,导致G1垃圾收集器频繁执行,增加了GC时间。可以尝试放宽这个值,比如设置为200或250毫秒,以减少GC的频率。 -
调整
-XX:InitiatingHeapOccupancyPercent
:当前设置为40%,意味着堆使用率达到40%时就开始并发GC周期。可以考虑提高这个阈值,比如设置为60%或70%,以减少GC的频率。 -
增加
-XX:ConcGCThreads
:增加并发GC线程的数量,可以加快GC的处理速度。但要注意,增加线程数会消耗更多的CPU资源,需要根据实际CPU核心数和系统负载进行调整。 -
优化堆内存大小:
-Xmx
和-Xms
都设置为18GB,如果通过监控发现实际使用的堆内存远低于这个值,可以适当减小堆大小,以减少GC的工作量。
2. 应用层面的优化
-
对象池:对于频繁创建和销毁的对象,使用对象池可以减少GC的压力。
-
减少大对象的分配:大对象的分配和回收会增加GC的负担,尽量避免在高频操作中分配大对象。
-
优化数据结构:选择更合适的数据结构,减少内存占用和提高访问效率。
-
缓存策略:合理使用缓存可以减少对后端服务的请求,降低系统负载,同时也减少了对象的创建。
3. 监控和分析
-
分析GC日志:通过开启的GC日志进行深入分析,找出GC的热点,了解是Minor GC还是Full GC导致的延迟,针对性地进行优化。
-
使用JVM监控工具:利用JVisualVM、JMC等工具实时监控JVM的性能,特别是堆内存的使用情况和GC活动。
4. 系统架构调整
-
服务拆分:对于电商平台这样的复杂系统,通过微服务架构拆分服务,可以更灵活地进行资源分配和扩展,提高系统的整体性能和稳定性。
-
负载均衡和扩容:合理分配负载,并根据系统负载情况动态扩容,可以有效应对高峰期的流量。
通过上述方法,可以有效地降低jvm.gc.time
时间,改善服务的tp999耗时,并提高系统性能。需要注意的是,调整JVM参数和进行系统优化都需要仔细测试,以确保不会引入新的问题。