jvm参数官网参照:https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
一、jvm参数设置
jvm参数总的概括可分为三大类,分别是标准参数、-X参数、-XX参数,其中还有其他参数,对应在-XX参数中存在。
1.jvm标准参数
标准参数:每个JDK版本都拥有的参数。
-version
查看jdk版本
-help
查看命令帮助
-server
server模式下启动
-jar
以jar包的方式启动应用程序
2.jvm非标准参数
非标准参数:-X参数,在不同JDK版本中可能出现变动,并且不向后兼容。
-Xint
解释执行,所有代码将直接执行不会编译成本地代码
-Xcomp
编译执行,第一次执行就编译成本地代码
-Xmixed
混合模式,jvm自己决定
3.jvm非稳定参数
非稳定参数:-XX参数,相对每个JDK版本最不稳定,使用最多,最要用户JVM调优。
Boolean类型:
格式:-XX:[±]name +或者-表示启用或者禁用name属性
例子:-XX:+UseG1GC 表示启用G1垃圾收集器
非Boolean类型:
格式:-XX:name=value 表示name属性的值赋值为value
比如:-XX:MaxHeapSize=10000 表示最大堆内存赋值为1000
其他参数:-XX参数的简写形式。
-Xms1000 相当于 -XX:InitialHeapSize=1000
-Xmx1000 相当于 -XX:MaxHeapSize=1000
-Xss100 相当于 -XX:ThreadStackSize=100
4.常用-XX参数设置
打印当前jdk版本所有-XX参数
java -XX:PrintFlagsFinal -version
=
表示默认是,:=
的参数值是已经被用户或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:+UseParallelGC | 使用UseParallelGC | 新生代,吞吐量优先 |
-XX:+UseParallelOldGC | 使用UseParallelOldGC | 老年代,吞吐量优先 |
-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:+HeapDumpOnOutOfMemoryError | 启动堆内存溢出打印 | 当JVM堆内存发生溢出时,也就是OOM,自动生成dump文件 |
-XX:HeapDumpPath=heap.hprof | 指定堆内存溢出打印目录 | 表示在当前目录生成一个heap.hprof文件 |
-XX:+PrintGCDetails、XX:+PrintGCTimeStamps、XX:+PrintGCDateStamps | 打印出GC日志 | 可以使用不同的垃圾收集器,对比查看GC情况 |
-Xloggc:$CATALINA_HOME/logs/gc.log | 指定日志输出路径 | |
-Xss128k | 设置每个线程的堆栈大小 | 经验值是3000-5000最佳 |
-XX:MaxTenuringThreshold | 提升年老代的最大临界值 | 默认值为 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 | 混合垃圾回收周期中要包括的旧区域设置 | |
占用率阈值 | 默认占用率为 65% | |
-XX:G1MixedGCCountTarget=8 | 设置标记周期完成后,对存活数据上限为G1MixedGCLIveThresholdPercent 的旧区域执行混合垃圾回收的目标次数 | 默认8次混合垃圾回收,混合回收的目标是要控制在此目标次数以内 |
XX:G1OldCSetRegionThresholdPercent=1 | 描述Mixed GC时,Old Region被加入到 | |
CSet中 | 默认情况下,G1只把10%的Old Region加入到CSet中 |
二、常用命令工具
1.jps
官网:https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jps.html
jps是一个查看当前运行jvm应用程序的命令工具
2.jinfo
官网:https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jinfo.html
jinfo命令打印指定Java进程或核心文件或实时修改服务器的Java配置信息。
查看一个java应用程序曾经被赋值过的参数
jinfo -flags PID
查看一个java应用程序单个参数值
格式:jinfo -flag 参数名 PID
例子:jinfo -flag UseG1GC 18204
实时修改一个java应用程序的值,并且只有标记为
manageable
的参数可以实时修改
格式:jinfo -flags [±]参数名 PID
例子:jinfo -flags +UseG1GC 12345
格式:jinfo -flags 参数名=参数值 PID
例子:jinfo -flags NewRatio=2 12345
3.jstat
官网:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html
jstat是一个查看jvm虚拟机性能统计信息的命令工具。
例如:查看gc信息,间隔1000毫秒共输出10次
jstat PID -gc 1000 10
4.jstack
官网:https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
jstack是一个查看jvm虚拟机线程堆栈信息的命令工具。
jstack PID
该命令工具可用于排查死锁等cpu消耗过高等异常。
5.jmap
官网:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html
jmap命令用于打印指定进程、核心文件或远程调试服务器的共享对象内存映射或堆内存详细信息。
查看堆内存信息
jmap -heap PID
导出内存dump文件
jmap -dump:format=b,file=heap.hprof PID
在开发环境中加入
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
参数可以在内存溢出时自动导出dump文件
三、可视化工具
1.jconsole
jconsole工具是一个兼容于jmx的图形化工具,用于监视Java虚拟机。
安装java环境后就存在jconsle工具,执行命令打开
jconsole
2.jvisualvm
Java VisualVM是一个直观的图形用户界面,当Java技术应用程序(Java应用程序)在给定的Java虚拟机(JVM*)上运行时,它提供有关Java技术应用程序(Java应用程序)的详细信息。
安装java环境后就存在jvisualvm工具,执行命令打开
jvisualvm
3.Arthas
Arthas是一个由阿里巴巴开源的Java诊断工具,Arthas允许开发人员在不修改代码或重启服务器的情况下对Java应用程序的生产问题进行故障排除。
1.检查类是否已加载,或类正在加载的位置。(用于排除jar文件冲突)
2.对类进行反编译,以确保代码按预期运行。
3.查看类装入器的统计数据,例如类装入器的数量、每个类装入器装入的类的数量、类装入器的层次结构、可能的类装入器泄漏等。
4.查看方法调用细节,例如方法参数、返回对象、抛出异常等。
5.检查指定方法调用的堆栈跟踪。当开发人员想要知道上述方法的调用者时,这是非常有用的。
6.跟踪方法调用以查找慢速子调用。
7.监控方法调用统计数据,如qps、rt、成功率等。
8.监视系统指标、线程状态和cpu使用情况、gc统计信息等。
9.支持命令行交互模式,支持自动完成功能。
10.支持telnet和websocket,它支持使用命令行和浏览器进行本地和远程诊断。
11.支持分析器/火焰图
12.支持JDK 6 +。
13.支持Linux / Mac / Windows。
安装
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
打印使用
java -jar arthas-boot.jar -h
官网用户使用手册:https://alibaba.github.io/arthas/en/
4.MAT
Memory Analyzer(MAT)是一个快速且功能丰富的Java堆分析器,它可以帮助您查找内存泄漏原因并减少内存消耗。
根据上方命令得到得heap.hprof文件使用MAT分析内存情况
用户手册:https://www.vogella.com/tutorials/EclipseMemoryAnalyzer/article.html
5.gceasy
gceasy是一个在线GC日志分析工具
可根据在java运行环境设置参数得到gc日志文件进行在线分析
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc.log
5.GCViewer
GCViewer是一个桌面应用程序GC日志分析工具