JVM调优

1 调优原则

  • 多数导致GC问题的Java应⽤,都不是因为我们参数设置错误,⽽是代码问题

  • 实际使用中,分析GC优化代码,比优化JVM参数效果要好,JVM 参数的默认(推荐)值都是经过 JVM 团队的反复测试和前人的充分验证得出的比较合理的值,因此通常来说是比较靠谱和通用的,一般不会出大问题。

  • 如果满足下面的指标,则一般不需要进行GC:

    • Minor GC执行时间不到50ms,不低于10秒一次;
    • Full GC执行时间不到1s,不低于一小时1次;

2. 检查Full GC 是否频繁

可以通过jstat -gc pid interval count,每隔interval秒,打印count次,pid进程下GC压力整体情况。观察是否出现频繁Full GC

image-20240612121617021

参数说明:

  • S0CS1C:幸存区 0 和幸存区 1 的容量分别为 14336 KB 和 10752 KB。

  • S0US1U:幸存区 0 没有使用,幸存区 1 使用了 10724.4 KB。

  • ECEU:伊甸园区的容量为 215040 KB,使用了 20511.6 KB。

  • OCOU:老年代的容量为 139776 KB,使用了 18056.9 KB。

  • MCMU:元空间的容量为 45184 KB,使用了 42025.9 KB。

  • CCSCCCSU:压缩类空间的容量为 6272 KB,使用了 5667.6 KB。

  • YGCYGCT:年轻代垃圾回收次数为 5 次,垃圾回收总时间为 0.068 秒。

  • FGCFGCT:完全垃圾回收次数为 2 次,垃圾回收总时间为 0.054 秒。

  • CGCCGCT:并发垃圾回收次数和时间未显示(可能是因为没有启用或发生)。

  • GCT:垃圾回收总时间为 0.122 秒。

3 JVM参数

可以考虑JVM内存模型

设置格式:

1
java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eureka‐server.jar 

  • -Xms:设置初始堆大小。
  • -Xmx:设置最大堆大小。

年轻代:

  • -Xmn<size>:设置年轻代内存大小。(老年代的大小等于堆内存大小减去年轻代的大小)

Eden区与Survivor区的比例:

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

年轻代与老年代

  • -XX:NewRatio=<ratio>:设置年轻代与老年代的比例。

永久代/元空间:

  • -XX:MaxPermSize=<size>:设置永久代的最大大小(仅适用于Java 7及之前版本)。

  • -XX:MetaspaceSize=<size>:设置元空间的初始大小。

  • -XX:MaxMetaspaceSize=<size>:设置元空间的最大大小(适用于Java 8及之后版本)

  • -Xss<size>:设置每个线程的堆栈大小。

垃圾收集器

  • -XX:+UseSerialGC:使用串行垃圾收集器。
  • -XX:+UseParallelGC:使用并行垃圾收集器(Parallel GC)。
  • -XX:+UseConcMarkSweepGC:使用并发标记清除垃圾收集器(CMS)。
  • -XX:+UseG1GC:使用G1垃圾收集器。
  • -XX:+UseZGC:使用ZGC垃圾收集器。
  • -XX:+UseShenandoahGC:使用Shenandoah垃圾收集器。

垃圾收集调优

  • -XX:MaxGCPauseMillis=<ms>:设置最大GC暂停时间。
  • -XX:G1HeapRegionSize=<size>:设置G1垃圾收集器的堆区域大小。
  • -XX:InitiatingHeapOccupancyPercent=<percent>:设置触发混合GC的堆占用百分比(用于G1)。
  • -XX:ParallelGCThreads=<n>:设置用于并行垃圾收集的线程数。

4. JVM调优案例

案例


JVM调优
http://example.com/JVM调优/
作者
Panyurou
发布于
2022年9月17日
许可协议