JVM 8的启动参数

图片来自pixabay.com的Myriams-Fotos会员

1. JVM版本

本文所描述的启动参数在如下JVM版本测试通过,

java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)

启动参数的推荐值主要针对的场景为:4核CPU + 4G内存的机器配置,部署单应用,应用的堆内存使用量在1-2GB。

2. 服务器配置

参数名 说明 默认值 推荐值 备注
server Java Hotsport Server VM 64位机器默认为server选项 启用 -

3. 堆大小

参数名 说明 默认值 推荐值 备注
Xms 堆空间初始大小 若没有设置,则根据old+young计算得出 Xms2G 堆的大小根据物理内存配置,不大于所能提供的物理内存
Xmx 堆空间最大值 根据系统配置 Xmx3G
XX:NewRatio Old/Young的空间比例 2 XX:NewRatio=2
XX:SurvivorRatio Eden/Survivor的空间比例 8 XX:SurvivorRatio=8
XX:+UseAdaptiveSizePolicy 分代空间动态调整 启用 启用 年轻代占整个堆内存三分之一,Survivor区占整个年轻代十分之一。(为推荐值,实际JVM会动态进行调优)

4. 元空间和线程栈大小

参数名 说明 默认值 推荐值 备注
XX:MaxMetaspaceSize 元数据空间大小 无上限 XX:MaxMetaspaceSize=256M
Xss 线程栈空间大小 根据virtual memory计算而定 Xss256K 栈的大小根据应用所需并发线程数决定,1000线程*256KB = 256 MB。若线程数大于2000,可以考虑配置为128KB。

5. GC回收器选择

5.1 串行GC回收器

不推荐为生产环境的配置,主要是由于无法利用现代计算机的多核优势。

适合的应用场景,
1. 对性能要求不要高的简单客户端应用,开发环境
2. 堆内存设置不大(<200MB)
3. 物理机器是单核CPU

5.2 并行GC回收器

此为JVM 8默认GC回收器。

适合的应用场景,
1. 生产环境的后台应用服务器
2. 系统配置较高,通常情况下至少四核(以目前的硬件水平为准)
3. 应用程序运行时间较长,对吞吐量要求较高,应用程序使用的堆内存大于1G

5.3 并发GC回收器(年轻代Parallel GC, 老年代CMS GC)

不推荐,JDK9已经移除对CMS GC的支持

5.4 G1回收器

此为JVM 9默认GC回收器。

适合的应用场景,
1. 生产环境的后台应用服务器
2. 系统配置较高,通常情况下至少四核(以目前的硬件水平为准)
3. 应用程序运行时间较长,对吞吐量要求较高,应用程序使用的堆内存大于4G

6. 日志和诊断信息

参数名 说明 默认值 推荐值 备注
XX:+PrintGCDetails
XX:+PrintGCDateStamps
Xloggc:./gc.log
XX:+PrintHeapAtGC
XX:+PrintTenuringDistribution
输出GC日志,以便监控查看 未开启 启用
XX:+HeapDumpOnOutOfMemoryError
XX:HeapDumpPath=./dump.hprof
在OOM时输出内存快照,以便后续问题调查 未开启 启用 相比PrintGCTimeStamps,使用PrintGCDateStamps会更加清晰易懂

7. 启动参数推荐样例

7.1 普通应用

  • 服务器配置:4核CPU + 4G内存,单应用部署。
  • 应用:堆内存使用量在500MB到1GB左右
java -server -Xms2G -Xmx2G -XX:MaxMetaspaceSize=256M -Xss256K -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseAdaptiveSizePolicy -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:../logs/gc.log -XX:+PrintTenuringDistribution  -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs/dump.hprof -jar pphh.jar

7.2 大内存堆的应用

  • 服务器配置:4核CPU + 16G内存,单应用部署,有足够的物理内存
  • 应用:堆内存使用量在2GB左右
java -server -Xms4G -Xmx4G -XX:MaxMetaspaceSize=256M -Xss256K -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseAdaptiveSizePolicy -XX:+UseG1GC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:../logs/gc.log -XX:+PrintTenuringDistribution  -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs/dump.hprof -jar pphh.jar

7.3 大内存堆的应用(物理内存出现瓶颈)

  • 服务器配置:4核CPU + 4G内存,部署单应用,
  • 应用:堆内存使用量在2GB左右
  • 物理内存只有4G,应用的堆内存无法设置为4G,并启用JVM的UseStringDeduplication
java -server -Xms3G -Xmx3G -XX:MaxMetaspaceSize=256M -Xss256K -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseAdaptiveSizePolicy -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:../logs/gc.log -XX:+PrintTenuringDistribution  -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs/dump.hprof -jar pphh.jar

7.4 JVM7的普通应用配置

  • 服务器配置:4核CPU + 4G内存,单应用部署
  • 应用:堆内存使用量在500MB到1GB左右
java -server -Xms2G -Xmx2G -XX:MaxPermSize=256M -Xss256K -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseAdaptiveSizePolicy -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:../logs/gc.log -XX:+PrintTenuringDistribution  -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=../logs/dump.hprof -jar pphh.jar

8. 参考资料