JVM Options 参数最佳实践汇总
JVM Options 参数最佳实践汇总

 

现有选项与释义

-server

启用 HotSpot Server 模式

-Xmssize

指定堆初始化大小,一般和-Xmx配置的一样

  • 2048m为4GB物理内存场景下建议配置

-Xmxsize

指定内存分配池最大分配的大小

  • 2048m为4GB物理内存场景下建议配置

-Xmnsize

指定年轻代的大小

  • 目前2048m堆场景下大部分配置的是800m,应该根据业务实际情况调整

-XX:MaxMetaspaceSize=size

指定可以分配给类元数据的最大内存。默认情况下,大小不受限制。应用程序的元数据量取决于应用程序本身,其他正在运行的应用程序以及系统上可用的内存量。

  • 目前大部分场景配置的都是256m,应该根据业务实际情况调整

-Xsssize

指定线程栈大小

  • 目前大部分场景配置的都是256k,应该根据实际业务情况调整

-XX:+UseConcMarkSweepGC

指定使用CMS垃圾收集器

-XX:CMSInitiatingOccupancyFraction=percent

指定CMS收集周期启动的阈值

  • 目前大部分场景配置的80%,应该根据实际业务情况调整

-XX:+UseCMSInitiatingOccupancyOnly

指定将老年代使用值作为启动CMS回收的唯一条件

-XX:AutoBoxCacheMax=size

自动装箱缓存值

  • 目前大部分场景配置20000,应该根据实际业务情况调整

-XX:-OmitStackTraceInFastThrow

针对某些多次抛出的异常进行优化

可增加选项及释义

性能相关

-Djava.security.egd=file:/dev/./urandom

指定获取随机数的熵来源

  • 没特殊安全需求的话建议增加此配置

GC相关

-XX:MaxTenuringThreshold=threshold

指定年轻代对象需要经过几次 GC 晋升到老年代的阈值

  • CMS默认是6,建议根据业务需求调整

内存大小相关

-XX:MetaspaceSize=size

指定metaspace扩缩容触发 FULL GC 的阈值

-XX:MaxDirectMemorySize=size

指定 direct-buffer 可申请最大的内存值

监控相关

-XX:ErrorFile=filename

指定 JVM Crash 时输出的 core dump 文件

-XX:+HeapDumpOnOutOfMemoryError

堆内存溢出时转储堆 dump

-XX:HeapDumpPath

指定上文选项转储堆 dump 时保存的路径

GC日志相关

-XX:+PrintGC

启用 GC 日志输出

-XX:+PrintGCDetails

启用 GC 详细日志输出

-Xloggc:filename

将 GC 日志重定向到文件输出

-XX:+PrintGCDateStamps

允许 GC 日志输出时携带日期时间戳

-XX:+PrintPromotionFailure

打开了就知道是多大的新生代对象晋升到老生代失败从而引发 Full GC 的

-XX:+PrintGCApplicationStoppedTime

输出 GC 日志时输出停顿的时间

推荐必须配置项与默认值

-Xmssize

  • 与 -Xmx 参数配置一致的值

-Xmxsize

  • 建议根据公式配置: 堆最大内存 ≈ 总物理内存 - Metaspace - MaxDirectMemorySize - 线程占用内存 - 运维提供的最小保留内存
  • 举例:
    • 最大可分配堆内存 = 8G(总物理内存) - 256M(Metaspace大小) - 256M(MaxDirectMemorySize,根据业务情况指定) - 300M(默认线程栈1M,估算线程数量有300,根据业务情况自行估算)- 500M(运维提供的最小保留内存)
    • 由于-Xmx参数要求value必须是1024的倍数且大于2MB,向下取整后得出 -Xmx=6g
  • 运维提供的最小保留内存,以运维提供的数值为准,主要为了确保系统上附带的例如监控等功能的正常,目前最小值为500MB,如果资源充足,建议预留1GB;
  • MaxDirectMemorySize,Hera 生成的统一模板项目自身对堆外内存的使用非常少,经过监控统计都在 1MB 以内,对于业务没有自行使用 Direct Memory 的服务,配置 256M 足够,如果业务有使用 Direct Memory,应当自行计算需要分配的最大值
  • 线程占用内存,建议为每个线程保留 1MB 的物理内存,结合业务需要的最大线程数配置,可以通过增加参数并且构造场景,查询具体需要的数值。
    • 例:默认配置 tomcat 线程数为300,结合其他线程100个左右,在这个场景就可以为线程预留内存 500MB 
    • 打印 Native Memory 详情:-XX:+UnlockDiagnosticVMOptions -XX:NativeMemoryTracking=summary -XX:+PrintNMTStatistics

  • 此外,新应用需要监控图表:https://grafana.tuhu.cn/d/lv6Fp6nWk/javajian-kong-3?orgId=4&refresh=30s中 Free swap space in percent 模块,如果发现有SWAP区占用,请对应调小配置的堆大小

-Xmnsize

  • 大部分的业务场景,老年代使用的频率比较小,建议配置为 -Xmx 参数配置值的一半,具体需要调优的,根据实际 GC 情况调整。

-XX:MetaspaceSize=size

  • 建议与 -XX:MaxMetaspaceSize 配置的值一致,防止 Metaspace 扩容时导致额外的 FULL GC。

-XX:MaxMetaspaceSize=size

  • 建议配置为 256m ,途虎的 Spring Cloud 项目一般使用量是 100MB 左右,如果有metaspace使用较多的情况,请根据实际情况调整。

-Xsssize

  • 建议配置为 256k

-XX:+UseConcMarkSweepGC

  • 2 ~ 4G 堆建议使用 CMS 收集器,G1 在小堆的表现大部分时间不如 CMS。

-XX:CMSInitiatingOccupancyFraction=percent

  • 建议配置为 80,避免碎片内存导致的 FULL GC。

-XX:+UseCMSInitiatingOccupancyOnly

  • 如不配置,除了第一次 CMS GC 会遵循 80% 的配置,后续依然会根据 JVM 计算的阈值触发老年代 GC

-XX:AutoBoxCacheMax=size

  • 建议配置为 20000

-XX:-OmitStackTraceInFastThrow

-XX:ErrorFile=filename

  • 建议配置为 /data/webroot/hs_err_%p.log,其中 %p 会替换为当时进程号,固定位置,好找问题。

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath

  • 建议配置为 /data/webroot,固定位置,好找问题。

-XX:+PrintGC

-XX:+PrintGCDetails

-XX:+PrintGCDateStamps

-XX:+PrintPromotionFailure

-XX:+PrintGCApplicationStoppedTime

  • 以上 GC 日志很重要还是需要输出

-Xloggc:filename

  • 建议配置为 /dev/shm/gc.log,/dev/shm是内存中的文件系统,避免高 IO 时,GC 被卡住
发布时间:2021-03-05 18:52:53 关键词:jvm java虚拟机 浏览量:123