目录
1、GC日志相关参数
-
-XX:+PrintGC
或-verbose:gc
输出简单GC日志信息 -
-XX:+PrintGCDeatils
输出详细GC日志信息 常用 -
-XX:+PrintGCTimeStamps
需要搭配输出GC信息使用,输出程序运行时间 常用 -
-XX:+PrintGCDateStamps
需要搭配输出GC信息使用,输出时间戳 -
-Xloggc:d:\gc.log
将GC信息输出到d:\gc.log文件中 常用 -
-XX:PrintHeapAtGC
每次GC前后打印堆信息
可以采用GCeasy在线分析GC日志
2、JVM监控及诊断工具
-
Jconsole JDK自带
-
Visual VM JDK自带
-
JProfile
-
Arthas
Arthas基本命令
- help——查看命令帮助信息
- cat——打印文件内容,和linux里的cat命令类似
- echo–打印参数,和linux里的echo命令类似
- grep——匹配查找,和linux里的grep命令类似
- base64——base64编码转换,和linux里的base64命令类似
- tee——复制标准输入到标准输出和指定的文件,和linux里的tee命令类似
- pwd——返回当前的工作目录,和linux命令类似
- cls——清空当前屏幕区域
- session——查看当前会话的信息
- reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
- version——输出当前目标 Java 进程所加载的 Arthas 版本号
- history——打印命令历史
- quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
- stop——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
- keymap——Arthas快捷键列表及自定义快捷键
jvm相关
- dashboard——当前系统的实时数据面板
- thread——查看当前 JVM 的线程堆栈信息
- jvm——查看当前 JVM 的信息
- sysprop——查看和修改JVM的系统属性
- sysenv——查看JVM的环境变量
- vmoption——查看和修改JVM里诊断相关的option
- perfcounter——查看当前 JVM 的Perf Counter信息
- logger——查看和修改logger
- getstatic——查看类的静态属性
- ognl——执行ognl表达式
- mbean——查看 Mbean 的信息
- heapdump——dump java heap, 类似jmap命令的heap dump功能
- vmtool——从jvm里查询对象,执行forceGc
class/classloader相关
- sc——查看JVM已加载的类信息
- sm——查看已加载类的方法信息
- jad——反编译指定已加载类的源码
- mc——内存编译器,内存编译
.java
文件为.class
文件 - retransform——加载外部的
.class
文件,retransform到JVM里 - redefine——加载外部的
.class
文件,redefine到JVM里 - dump——dump 已加载类的 byte code 到特定目录
- classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource
monitor/watch/trace相关
请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行
stop
或将增强过的类执行reset
命令。
- monitor——方法执行监控
- watch——方法执行数据观测
- trace——方法内部调用路径,并输出方法路径上的每个节点上耗时
- stack——输出当前方法被调用的调用路径
- tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
3、JVM监控及诊断工具-命令行篇
- jps 查看Java进程
-
jps
: 显示Java进程号和主类名称 -
jps -q
:只显示Java进程号 -
jps -l
:显示主类全类名 -
jps -m
:显示主类main()的参数 -
jps -v
:显示进程启动的JVM参数
-
-
jstat查看JVM统计信息
-
格式:
jstat -<option> [-t] [-h] <vmid> [interval] [count]
-
option: 要查看什么统计信息
- -t : 程序运行到现在耗时
- -h : 输出多少行后输出一次表头信息
- vmid: 要查看的进程号
- interval: 间隔多少毫秒输出一次统计信息
- count: 输出多少次终止
-
当GC时间占总时间比率很大时,说明频繁GC,越大越可能OOM
当老年代占用内存不断上涨,可能出现内存泄漏
-
jinfo实时查看,修改JVM参数
-
jinfo -sysprops pid
: 查看System.getProperties()
取得的参数 (很多信息) -
jinfo -flags pid
: 查看曾经赋值的参数 -
jinfo -flag JVM参数名 pid
: 查看某个Java进程的具体某个参数信息 -
jinfo -flag [+/-]JVM参数名 pid
修改布尔类型 -
jinfo -flag JVM参数名=参数值 pid
修改非布尔类型
-
-
扩展
java -XX:+PrintFlagsInitial
: 查看所有JVM参数启动初始值java -XX:+PrintFlagFinal
: 查看所有JVM参数最终值java -参数名:+PrintCommandLineFlags
查看被修改过的某参数值
-
jmap导出内存映像文件和内存使用情况
-
jmap [option] pid option有以下选项
-
- 手动导出 : 手动直接立即导出
-
jmap -dump:format=b,file=导出目录\文件名.hprof pid
-
jmap -dump:live,format=b,file=导出目录\文件名.hprof pid
-
-
自动导出: 启动程序时需要带参数,发生OOM时自动导出
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=导出目录\文件名.hprof
jmap会访问所有对象,为了不被用户线程干扰,jmap会借助安全点,在安全点中所有线程不会改变堆中对象状态,也就是说: jmap导出的内存快照文件都是在安全点位置的。结果可能出现偏差(比如某对象声明周期在两个安全点,使用live时就无法探知到这些对象)
-
jstack打印JVM线程快照
-
jstack option pid
-
- jcmd多功能命令行
- jcmd可以实现除了jstat外所有指令的功能
4、JVM运行时参数
- 打印设置的-XX选项
-XX:+PrintCommandLineFlags
打印命令行启动时添加的-XX选项或JVM自动设置的-XX选项-XX:+PrintFlagsInitinal
打印出所有-XX选项默认值-XX:+PrintFlagsFinal
打印出-XX选项最终在程序运行时的值(使用jinfo -flag 修改参数 pid
进行修改)-XX:+PrintVMOption
打印JVM参数
-
运行时内存区的-XX选项
-
-Xss100k
设置栈内存为100k,等同于-XX:ThreadStackSize
-
Xms100m
设置堆内存初始化为100m,等同于-XX:InitalHeapSize=100m
-
Xmx100m
设置最大堆内存为100m,等同于-XX:MaxHeapSize=100m
-
Xmn2g
设置年轻代最大内存为2g,等同于-XX:NewSize=2g
+-XX:MaxNewSize=2g
-
-XX:+UseAdaptiveSizePolicy
自动选择各区比例大小(默认开启) -
-XX:SurvivorRatio=8
设置survivor:Eden占比为 1:1:8- 这个值默认为8,如果
-XX:+UseAdaptiveSizePolicy
是开启的,survivor:eden比例会被自动调成为1:1:6
- 这个值默认为8,如果
-
-XX:NewRatio=2
设置年轻代:老年代占比为 1:2 -
-XX:PretenureSizeThreadshold=2014
设置内存大于此值(byte)的对象作为大对象直接分配到老年代 -
-XX:MaxTenuringThreshold=15
对象年龄超过15进入老年代 -
-XX:+PrintTenuringDistribution
JVM每次MinorGC后打印出当前使用的Survivor中对象的年龄分布 -
-XX:TargetSurvivorRatio
MinorGC结束后Survivor区域中占用空间的期望比例
-
-
方法区的-XX选项
-
-XX:MetaspaceSize
元空间初始大小 -XX:MaxMetaspaceSize
元空间最大大小-XX:+UseCompressedOops
使用压缩对象指针-XX:+UseCompressedClassPointers
使用压缩类执行-XX:ComporessedClassSpaceSize
设置ClassMetaspace大小,默认1g
-
-
直接内存的-XX选项
-
-XX:MaxDiectMemorySize
设置直接内存大小,未指定则和最大堆内存一致
-
-
OOM相关的-XX选项
-
-XX:+HeapDumpOutOfMemoryError
发生OOM时生成堆dump文件 -
-XX:+HeapDumpBeforeFullGC
发生FullGC时生成堆dump文件 -
-XX:HeapDumpPath=d:\
指定生成堆dump文件路径为d:\ (默认生成的dump文件在项目当前目录下) -
-XX:OnOutOfMemoryError=/opt/restart.sh
发生OOM时去执行/opt/restart.sh文件
-
-
垃圾收集器相关的-XX选项
- Serial 串行收集器
-XX:+UseSerialGC
年轻代,老年代都使用串行收集器
-
ParNew 并行收集器
-XX:+UseParNewGC
年轻代使用ParNew收集器- JDK14 CMS被移除 没有老年代收集器配合 , 被废弃
-
Parallel 吞吐量优先并行收集器
-XX:+UseParallelGC
-XX:+UseParallelOldGC
使用任意一个参数,新生代,老年代就会使用Parallel收集器-XX:ParallelGCThreads
设置年轻代并行收集线程个数,逻辑处理器(CPU)个数 < 8 : 设置与核心数相同,CPU个数 > 8 : 设置线程数 = 3 + (5 * 核心数) / 8-XX:+UseAdaptiveSizePolicy
自适应调节策略-XX:MaxGCPauseMillis
设置最大STW时间,单位ms.Parallel 主打高吞吐量优先,该参数具体值最好由-XX:+UseAdaptiveSizePolicy
来分配-XX:GCTimeRatio=N
垃圾收集时间占比(1/N+1)。用于衡量吞吐量,该值设置越大就与设置最大STW时间-XX:MaxGCPauseMillis
矛盾,不能同时使用
-
CMS 并发收集器
-
-XX:+UseConcMarkSweepGC
老年代使用CMS垃圾收集器,新生代使用ParNew收集器 -
-XX:CMSInitiatingOccupancyFraction
设置老年代使用多少空间时开始垃圾回收。如果设置的太高,不够内存分配,不能满足并发执行,就会冻结用户线程启动Serial Old收集器,停顿时间就会变长。如果内存增长缓慢可以设置高一些,如果内存增长很快就要设置低一些 默认92% -
-XX:+UseCMSCompactAtFullCollection
指定在FULL GC后是否对内存进行压缩整理。开启后,通过-XX:CMSFullGCsBeforeCompaction
设置执行多少次FULL GC后进行内存压缩整理 -XX:ParallelCMSThreads
设置CMS线程数量
-
- Serial 串行收集器
-
G1 低延迟分代收集器
-
-XX:+UseG1GC
使用G1收集器 -
-XX:G1HeapRegionSize
设置每个region大小 -
-XX:MaxGCPauseMillis
设置预期停顿时间 (默认200ms,最好不要太小) -
-XX:ParallelGCThread
设置STW时GC线程数 -
-XX:ConcGCThreads
设置并发标记线程数 -
-XX:InitiatingHeapOccupancyPercent
设置触发老年代GC的堆占用率阈值 -
使用分代收集器最好不要使用
-XX:NewRatio
,-Xmn
这种参数,会影响G1自动调节
-
-
GC日志相关的-XX选项
-
-XX:+PrintGC
或-verbose:gc
输出简单GC日志信息 -
-XX:+PrintGCDeatils
输出详细GC日志信息 常用 -
-XX:+PrintGCTimeStamps
需要搭配输出GC信息使用,输出程序运行时间 常用 -
-XX:+PrintGCDateStamps
需要搭配输出GC信息使用,输出时间戳 -
-Xloggc:d:\gc.log
将GC信息输出到d:\gc.log文件中 常用 -
-XX:PrintHeapAtGC
每次GC前后打印堆信息
-
-
其他JVM参数