JVM参数通常分为几类

  1. -标准参数,需要所有虚拟机都要支持实现并兼容
  2. -D设置系统属性

设置spring参数的时候或者其他环境变量的时候可以使用

  1. -X非标准参数,传递JVM使用,但不保证所有虚拟机都实现并向后兼容
  2. -XX非稳定参数,控制JVM行为,跟具体虚拟机实现相关,可能会取消

-XX:+/-Flag 布尔值开关, 例 -XX:+UseG1GC 使用G1垃圾回收器
-XX:key=value 指定具体项目值

常用参数列表

标准参数

  • -server server模式,运行更稳定
  • -client

非标准参数

  • -Xms256m 指定最小堆内存256m
  • -Xmx256m 指定最大堆内存256m

通常指定 Xms=Xmx 避免jvm反复申请内存空间,建议申请空间比实际最小空间稍大一些

  • -Xmn100m 指定年轻代内存空间大小,推荐配置是整个堆空间的3/8

注意一下年轻代是一个eden区+2个survivor区构成

  • -Xss256k 设置栈内存大小

默认为1m,减少线程堆栈空间可以生成更多线程数。一般系统线程数 3000~5000,小应用128k,大应用256k,根据实际情况设置

非稳定参数

  • -XX:+UseXXGC 指定GC收集器
  • -XX:CMSFullGCsBeforeCompaction 指定运行FullGc多少次后进行内存压缩

CMS(并发-标记-清除)参数

  • -XX:+/-HeapDumpOnOutOfMemoryError 当OOM时自动生成dump文件排查(推荐使用)
  • -XX:HeapDumpPath= 设置dump文件存放路径,配合HeapDumpOnOutOfMemoryError使用
  • -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888

开启远程调试,生产环境不使用

示例

-Xmx32g -Xms32g -Xmn1g -Xss256k-XX:SurvivorRatio=2 
-XX:MaxPermSize=256m-XX:+UseParNewGC-XX:+UseConcMarkSweepGC
-XX:ParallelGCThreads=10-XX:ParallelCMSThreads=16
-XX:+CMSParallelRemarkEnabled-XX:MaxTenuringThreshold=15
-XX:+UseCMSCompactAtFullCollection
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:+CMSClassUnloadingEnabled
-XX:-DisableExplicitGC
-XX:+HeapDumpOnOutOfMemoryError-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-Xloggc:/app/log/hbase/gc-hbase-REGIONSERVER-`hostname`-`date +%Y%m%d`.log

JVM工具

常用的线上诊断工具

  • jhat

可以查看dump并生成网页端可打开的class信息,比较早的工具

  • jcmd

包含其他java工具中的大部分功能,可以查看堆的内存使用情况和GC情况

  • MAT

堆内存查看工具,可以看
下面是几个JVM监控工具

  • jvisualvm
  • jconsole
  • Arthas

阿里出品的JVM监控工具,集合了上述的所有功能,可以在线查看JVM运行情况,运行的class对象以及函数入参,并且进行class替换。有条件推荐使用

参考资料-1-掘金
参考资料-2-JVM参数设置大全
jvm官网

Q.E.D.


每一个平凡的日常都是连续的奇迹