JVM常用命令
参考博客:JVM常用命令
一、常用JVM参数:
-Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
-Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
-Xss:每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named ThreadStackSize”一般设置这个值就可以了。
-XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
-XX:MaxPermSize:设置持久代最大值。物理内存的1/4。
例如:
-Xms1024M JVM 初始堆内存 = 1024MB(启动时就分配这么多)
-Xmx1024M JVM 最大堆内存 = 1024MB(最多只能用这么多)
堆是 Java 存放对象的地方。-Xms 是"起步就占这么多",-Xmx 是"最多能占这么多"。这里两个设成一样,说明固定用 1GB 堆,避免运行时反复扩缩容带来的性能波动。
例如:
JVM_PERFORMANCE_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=20 -XX:InitiatingHeapOccupancyPercent=35 -XX:+DisableExplicitGC -Djava.awt.headless=true"
解释:
| 参数 | 含义 |
|---|---|
-server |
使用服务器模式 JVM(针对长期运行、高吞吐优化,现在基本是默认) |
-XX:+UseG1GC |
使用 G1 垃圾回收器(一种兼顾吞吐和停顿的现代 GC) |
-XX:MaxGCPauseMillis=20 |
GC 目标最大停顿时间 20 毫秒(G1 会尽量向这个目标靠拢) |
-XX:InitiatingHeapOccupancyPercent=35 |
当堆使用率达到 35% 时,启动并发 GC 周期 |
-XX:+DisableExplicitGC |
禁用代码里显式调用的 System.gc()(防止它触发 Full GC 拖慢系统) |
-Djava.awt.headless=true |
无图形界面模式,服务器没有显示器时避免 AWT 报错 |
通俗理解:这一组是在调 GC(垃圾回收)的行为。G1 是"边运行边回收、尽量少停顿"的回收器,这几个参数是在告诉它:停顿别超过 20ms,堆用到 35% 就开始准备回收,别人为乱调 System.gc()。
例如:
JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false -XX:+UnlockCommercialFeatures -XX:+FlightRecorder"
JMX_OPTS="-Dcom.sun.management.jmxremote.port=${JMX_REMOTE_PORT} ${JMX_OPTS}"
JMX 是 Java 的管理监控接口,开启后可以用 JConsole、VisualVM 等工具远程连接这个 Java 进程,查看内存、线程、GC 情况。
| 参数 | 含义 |
|---|---|
| -Dcom.sun.management.jmxremote | 开启 JMX 远程管理 |
| -Dcom.sun.management.jmxremote.port=端口 | 指定 JMX 监听端口 |
| -Dcom.sun.management.jmxremote.authenticate=false | 关闭身份认证(谁都能连,⚠️ 有安全风险) |
| -Dcom.sun.management.jmxremote.ssl=false | 关闭 SSL 加密(明文传输,⚠️ 有安全风险) |
| -XX:+UnlockCommercialFeatures | 解锁商业特性(旧版 JDK 才有,JDK 11 后已移除) |
| -XX:+FlightRecorder | 开启 JFR(飞行记录器),用于记录 JVM 运行事件做性能分析 |
通俗理解:这一组是"给运维/开发留个后门,方便远程监控这个 Java 进程"。但认证和 SSL 都关了,只适合内网可信环境。
第二行是追加写法:把 port 拼到原有 JMX_OPTS 前面,最终包含端口。
例如:
GC_LOG_OPTS="-Xloggc:/usr/local/projects/app/logs/appName-gc-$(date '+%F_%H-%M-%S').log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps"
参数解释:
| 参数 | 含义 |
|---|---|
-Xloggc:路径 |
把 GC 日志写到指定文件 |
-verbose:gc |
打印 GC 简要信息 |
-XX:+PrintGCDetails |
打印 GC 详细信息(回收前后大小、耗时等) |
-XX:+PrintGCDateStamps |
日志里带上真实日期时间 |
-XX:+PrintGCTimeStamps |
日志里带上相对 JVM 启动的时间 |
通俗理解:把垃圾回收的"流水账"记到文件里,方便事后分析内存回收是否正常、有没有频繁 Full GC。
这些参数在 JDK 9+ 已废弃,新版本改用统一的 -Xlog:gc* 语法。如果你的 JDK 较新,这些可能不生效或报警告。
例如:
OTHER_JAVA_OPTS="-Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_HOME}"
参数解释:
| 参数 | 含义 |
|---|---|
| -Dfile.encoding=UTF-8 | 文件编码用 UTF-8,避免中文乱码 |
| -XX:+HeapDumpOnOutOfMemoryError | 发生 OOM(内存溢出)时自动导出堆快照 |
| -XX:HeapDumpPath=路径 | 指定堆快照文件的存放目录 |
通俗理解:设置编码防乱码;并在内存爆掉时自动"拍快照",方便事后用 MAT 等工具分析是什么对象把内存撑爆了。
--
浙公网安备 33010602011771号