JVM命令与参数
文章目录
经过前面的各种分析学习,我们知道了关于JVM很多的知识,包括版本信息,类加载,堆,方法区,垃圾回收等,这一章我们来好好聊一聊关于怎么将这些内容进行直观地展示在我们面前,包括怎么进行相应地一些设置。
JVM参数
标准参数
- -version
- -help
- -cp
-X 参数
非标准参数,也就是在JDK各个版本中可能会变动
- -Xint 使用解释模式,启动很快,执行稍慢
- -Xcomp 使用纯编译模式,执行很快,启动很慢
- -Xmixed 默认为混合模式,开始解释执行,启动速度较快,对热点代码实行检测和编译
-XX参数
使用得最多地参数类型,非标准化参数,相对不稳定,主要用于JVM调优和Debug
-
Boolean类型
格式:-XX[±] <name> +或- 表示启用或者禁用name属性
比如:-XX:+UseConcMarkSweepGC 表示启用CMS类型的垃圾回收器
-XX:+UseG1GC 表示启用G1类型的垃圾回收器
-
非Boolean类型
格式:-XX:<name>=<value>表示name属性的值是value
比如:-XX:MaxGCPauseMillis=500 表示GC最大停顿时间为500毫秒
想要设置的话,得先知道默认JVM中参数相关的信息
下面这个针对的是Java这个进程
java -XX:+PrintFlagsFinal -version > flags.txt
如果要查看一个运行中的JVN相关参数的信息,可以使用
jinfo
,不过要先知道Java进程的ID。比如启动一个tomcat,它的PID为200,如下图所示
通过 jinfo -flags PID
查看更多
设备参数的常见方式
- 开发工具中设置比如IDEA,Eclipse
- 运行jar包的时候设置,例如
java -XX:+UseG1GC xxx.jar
- web容器比如tomcat,可以在脚本中进行设置
- 通过
jinfo
实时调整某个java进程的参数(参数只有被标记为manageable的flags可以被实时修改)
其他参数
- Xms1000等价于 -XX:InitialHeapSize=1000
- Xmx1000等价于 -XX:MaxHeapSize=1000
- Xss1000等价于 -XX:ThreadStackSize=100
其实这块也相当于是-XX类型的参数
说明
一般要设置参数,可以先查看一下当前参数是什么,值得注意的是“=”表示默认值,“:=表示被用户或JVM修改后的值”。
常用参数的意义
参数 | 含义 | 说明 |
---|---|---|
-XX:CICompilerCount=3 | 最大并行编译数 | 如果设置大于1,虽然编译速度会提高,但是同样影响系统稳定性, 会增加JVM崩溃的可能 |
-XX:InitialHeapSize=100M | 初始化堆大小 | 简写为-Xms100M |
-XX:MaxHeapSize=100M | 最大堆大小 | 简写为-Xmx100M |
-XX:NewSize=20M | 新生代大小 | |
-XX:MaxNewSize=50M | 最带新生代大小 | |
-XX:OldSize=50M | 老年代大小 | |
-XX:MetaspaceSize=50M | 方法区大小 | |
-XX:MaxMetaspaceSize=50M | 最大方法区大小 | |
-XX:+UseParalleGC | 使用ParalleGC | 新生代,吞吐量优先 |
-XX:+UseParalleOldGC | 使用ParalleOldGC | 老年代,吞吐量邮箱 |
-XX:+UseConcMarkSweepGC | 使用CMS | 老年代,停顿时间优先 |
-XX:-UseG1GC | 使用G1GC | 新生代,老年代,停顿时间优先 |
-XX:NewRatio | 新老生代的比值 | 比如-XX:Ratio=4,则表示新生代:老年代=1:4,也就是新生代占整个堆内存的1/5 |
-XX::SurvivorRatio | 两个S区和Eden区的比值 | 比如-XX:SurvivorRatio=8,也就是(S0+S1): Eden=2:8,也就是一个S占整个新生代的 1/10 |
-XX:+HeapDumpOnOutOnMemeryError | 启动堆内存溢出打印 | 当JVM堆内存发生溢出时,也就是OOM,自动生成dump文件 |
-XX:HeapDumpPath=heap.hprof | 制定堆内存溢出打印目录 | 表示在当前目录生成一个heap。hprof文件 |
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps Xloggc:$CATALINA_HOME/logs/gc.log | 打印出GC日志 | 可以使用不同的垃圾收集器,对比查看GC情况 |
-Xss128k | 设置每个线程的栈堆大小 | 经验值是3000-5000最佳 |
-XX::MaxTenuringThreshold=6 | 老年代的最大临界值 | 默认值为15 |
-XX:InitiatingHeapOccupancyPercent | 启动并发GC周期时堆内存使用占比 | G1之内的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比,值为0则表示“一直执行GC循环”,默认值为45 |
-XX:G1HeapWastePercent | 允许浪费堆空间的占比 | 默认是10%,如果并发标记可回收的空间小于10%,则不会触发MixedGC。 |
-XX:MaxGCPauseMillis=200ms | G1最大停顿时间 | 暂停时间不能太小,太小的话就会导致出现G1跟不上垃圾产生的速度。最终退化为Full GC。所以对这个参数的调优是一个持续的过程,逐步调整到最佳状态。 |
-XX:ConcGCThreads=n | 并发垃圾收集器使用的线程数量 | 默认值随JVM运行平台的不同而不同 |
-XX:G1MixedGCLiveThresholdPercent | 混合垃圾回收周期中要包括的旧区域设置占用率阈值 | 默认占用率为65% |
-XX:G1MixedGCCountTarget | 设置标记周期完成后,对存活数据上限为G1MixedGCLiveThresholdPercent的旧区域执行混合垃圾回收的目标次数 | 默认8次混合垃圾回收,混合回收的目标是要控制在此目标次数以内 |
-XX:G1OldCSetRegionThresholdPercent | 指定每轮Mixed GC回收的Region最大比例 | 默认情况下,G1只把10%的Old Region加入到CSet中 |
常用命令
命令详细介绍可在官网中查询 search
jps
查看java进程
jinfo
实时查看和调整JVM配置参数
查看用法
jinfo -flag name PID
查看某个java进程的name属性值比如:
jinfo -flag MaxHeapSize PID
查看最大堆内存大小
jinfo -flag Use G1GC PID
查看是否使用G1GC
调整用法
参数只有被标记为Manageable的flags可以被实时修改
jinfo -flag [+|-] PID
jinfo -flag <name>=<value> PID
查看曾经赋过值的一些参数
jinfo -flags PID
jstat
查看虚拟机性能统计信息
查看类装载信息
jstat -class PID 1000 10
查看某个Java进程的类装载信息,每1000毫秒输出一次,供输出10次
查看垃圾收集信息
jstat -gc PID 1000 10
查看某个Java进程的垃圾收集信息,每1000毫秒输出一次,供输出10次
jstack
查看线程堆栈信息
用法
jstack PID
jmap
生成堆转储快照
打印出堆内存相关信息
jmap -heap PID
dump出堆内存相关信息
jmap -dump:format=b,file=xxx.hprof PID
dump下来的文件直接看有些费力,可以结合MAT工具分析。一般在开发中,JVM参数可以通过添加参数,这样内存溢出时,会自动dump该文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
常用工具
jconsole
JConsole工具是JDK自带的可视化监控工具,查看Java应用程序的运行情况,监控堆信息,永久区使用情况,类加载情况等
jvisualvm
-
可以监控本地的java进程的cpu,类,线程等
-
也可以监控远端java进程,比如监控远端tomcat
如果是连接远端tomcat[也可以是任意Java进程],比如部署在阿里云服务器上的tomcat,可以按照以下步骤
(1)在visualvm中选中“远程”,右击“添加”
(2)主机名上写服务器的ip地址,比如39.100.39.63
(3)右击该主机,添加“JMX”,也就是通过JMX技术具体监控远端服务器哪个Java进程
(4)要想让服务器上的tomcat被连接,需要改一下Catalina.sh这个文件注意端口不要和服务器上的有冲突
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote - Djava.rmi.server.hostname=39.100.39.63 -Dcom.sun.management.jmxremote.port=8998 - Dcom.sun.management.jmxremote.ssl=false - Dcom.sun.management.jmxremote.authenticate=true - Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access - Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password"
(5)在…/conf文件中添加两个文件jmxremote.access和jmxremote.password
jmxremote.access
guest readonly manager readwrite
jmxremote.password
guest guest manager manager
授予权限 :
chomd 600 *jmxremot*
(6)将连接服务器地址改为公网ip地址
(7)查看端口监听情况
lsof -i:port #得到PID netstat -antup | grep PID
(8)设置上述端口的防火墙策略和安全组策略
(9)启动远端java进程,
(10)在jmx 中输入端口,输入用户名和密码即可登录成功
内存分析工具 MAT
GC日志分析工具
要想分析日志的信息,首先得拿到GC日志文件,可以通过配置启动参数获取GC日志文件
XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log
- 在线查看工具 http://gceasy.io
- GCViewer
(9)启动远端java进程,
(10)在jmx 中输入端口,输入用户名和密码即可登录成功
内存分析工具 MAT
GC日志分析工具
要想分析日志的信息,首先得拿到GC日志文件,可以通过配置启动参数获取GC日志文件
XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log
- 在线查看工具 http://gceasy.io
- GCViewer