1. JVM版本
本文所描述的启动参数在如下JVM版本测试通过,
1 | java version "1.8.0_172" |
启动参数的推荐值主要针对的场景为: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回收器。
适合的应用场景,
- 生产环境的后台应用服务器
- 系统配置较高,通常情况下至少四核(以目前的硬件水平为准)
- 应用程序运行时间较长,对吞吐量要求较高,应用程序使用的堆内存大于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左右
1 | 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左右
1 | 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
1 | 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左右
1 | 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. 参考资料
- JVM 7 启动参数
- JVM 8 启动参数
- Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide
- JDK 9