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 等工具分析是什么对象把内存撑爆了。

 

 

 

 

 

 

 

 

 

 

 

--

posted on 2022-07-25 21:43  有点懒惰的大青年  阅读(119)  评论(0)    收藏  举报