怎么样通过合理配置 JVM 参数来提升 Java 服务端程序的整体性能?

样通过合理配置 JVM 参数来提升 Java 服务端程序的整体性能?具体说说一些关键参数(如堆内存大小、垃圾回收器选择等)的设置原则和影响。

虽然较大的堆内存可以容纳更多的数据,但也不能盲目地设置过大。过大的堆内存可能导致垃圾回收时间过长,因为每次垃圾回收需要遍历和处理的内存区域更大,反而会影响程序的性能和响应速度。

阅读 1.2k
1 个回答
  1. java -XX:+PrintFlagsInitial
    此命令打印JVM启动时使用的所有参数的初始值。
  2. java -XX:+PrintFlagsFinal
    此命令打印JVM运行时使用的所有参数的最终值。
    上述命令仅打印部分常用参数。要查看所有参数,请使用 -XX:+PrintAllFlags 或 -XX:+PrintAllFlagsFinal。

在容器环境下
推荐的JVM参数设置

-XX:+UseG1GC
-XX:+UseContainerSupport
-XX:InitialRAMPercentage=70.0
-XX:MaxRAMPercentage=70.0
-Xss512k
-Xlog:gc*=info:file=/app/gc%t.log:utctime,level,tags:filecount=50,filesize=100M
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/app/dump-%t.hprof

参数说明如下:
参数 说明

-XX:+UseContainerSupport    使用容器内存。允许JVM从主机读取cgroup限制,例如可用的CPU和RAM,并进行相应的配置。当容器超过内存限制时,会抛出OOM异常,而不是强制关闭容器。
-XX:InitialRAMPercentage    设置JVM使用容器内存的初始百分比。建议与 -XX:MaxRAMPercentage 保持一致,推荐设置为70.0。
-XX:MaxRAMPercentage    设置JVM使用容器内存的最大百分比。由于存在系统组件开销,建议最大不超过75.0,推荐设置为70.0。
-Xss128k,设置每个线程的栈大小为128 KB。
-XX:NewRatio=4,设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。如果设置为4,那么年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5。
-XX:MaxGCPauseMillis=100 设置每次年轻代垃圾回收的最长时间为100 ms。
-XX:+PrintGCDetails    输出GC详细信息。
-XX:+PrintGCDateStamps    输出GC时间戳。日期形式,例如2019-12-24T21:53:59.234+0800。
-Xloggc:/var/log/gc/gc-${POD_IP}-$(date '+%s').log    GC日志文件路径。需保证Log文件所在容器路径已存在,建议您将该容器路径挂载到NAS目录,以便自动创建目录以及实现日志的持久化存储。
-XX:+HeapDumpOnOutOfMemoryError    JVM发生OOM时,自动生成DUMP文件。
-XX:HeapDumpPath=/var/dump/dump-${POD_IP}-$(date '+%s').hprof    DUMP文件路径。需保证DUMP文件所在容器路径已存在,建议您将该容器路径挂载到NAS目录,以便自动创建目录以及实现日志的持久化存储。

说明
使用 -XX:+UseContainerSupport 参数需JDK 8u191+、JDK 10及以上版本。

Dragonwell 11暂不支持 ${POD_IP} 变量。

通过-Xms -Xmx限制堆大小

推荐的JVM参数设置

-Xms2048m -Xmx2048m
-Xss512k
-Xlog:gc*=info:file=/app/gc%t.log:utctime,level,tags:filecount=50,filesize=100M
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/app/dump-%t.hprof

参数说明如下:
参数 说明

-Xms    设置JVM初始内存大小。建议与 -Xmx 相同,避免每次垃圾回收完成后JVM重新分配内存。  
-Xmx    设置JVM最大可用内存大小。为避免容器OOM,请为系统预留足够的内存大小。
-XX:+PrintGCDetails    输出GC详细信息。
-XX:+PrintGCDateStamps    输出GC时间戳。日期形式,例如2019-12-24T21:53:59.234+0800。
-Xloggc:/var/log/gc/gc-${POD_IP}-$(date '+%s').log    GC日志文件路径。需保证Log文件所在容器路径已存在,建议您将该容器路径挂载到NAS目录以便自动创建目录以及实现日志的持久化存储。
-XX:+HeapDumpOnOutOfMemoryError    JVM发生OOM时,自动生成DUMP文件。
-XX:HeapDumpPath=/var/dump/dump-${POD_IP}-$(date '+%s').hprof    DUMP文件路径。需保证DUMP文件所在容器路径已存在,建议您将该容器路径挂载到NAS目录,以便自动创建目录以及实现日志的持久化存储。

推荐的堆大小设置

内存规格大小 JVM堆大小

1 GB    600 MB
2 GB    1434 MB
4 GB    2867 MB
8 GB    5734 MB

分代zgc
-XX:+UseZGC -XX:+ZGenerational
ShenandoahGC
-XX:+UseShenandoahGC

oracle jdk23 加入了graalJIT
-XX:+UnlockExperimentalVMOptions -XX:+UseGraalJIT

宣传栏