[总结]-第四章 虚拟机性能监控与故障处理工具
进入JDK安装目录
cd $JAVA_HOME/binls
输出
appletviewer javah jjs jvisualvm schemagenextcheck javap jmap keytool serialveridlj javapackager jmc native2ascii servertooljar jcmd jps orbd tnameservjarsigner jconsole jrunscript pack200 unpack200java jdb jsadebugd policytool wsgenjavac jdeps jstack rmic wsimportjavadoc jhat jstat rmid xjcjavafxpackager jinfo jstatd rmiregistry
工具命令
名称 | 主要作用 |
---|---|
jps | JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程 |
jstat | JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据 |
jinfo | Configuration Info for Java,显示虚拟机配置信息 |
jmap | Memory Map for Java,生成虚拟机的内存转出快照(heapdump文件) |
jhat | JVM Heap Dump Browser,分析heapdump文件,可以在浏览器查看结果 |
jstack | stack trace for java,显示虚拟机的线程快照 |
jconsole | Java监视与管理控制台 |
jvisualvm | 多合一故障处理工具 |
jps
jps
输出
1794 Jps1410 1478 Launcher ---> 这是IDEA工具启动的服务1479 DemoStartApplication ---> 这是目标Java服务1230 Bootstrap
可以得知,当前的java服务的本地虚拟机唯一ID(LVMID)
选项 | 作用 |
---|---|
-q | 只输出LVMID |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-l | 输出主类全名,如果进程执行的事jar包,输出jar路径 |
-v | 输出虚拟机进程启动时JVM参数 |
比较常用的是 jps
和jps -v
jstat
# option=操作,interval=间隔时间,count=操作次数jstat [option] vmid [interval] [count]
例如
jstat -gc 1479 250 2
输出
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 41984.0 41472.0 0.0 0.0 810496.0 130073.9 271872.0 53990.9 71552.0 67042.8 8320.0 7480.3 19 0.259 5 0.845 1.10441984.0 41472.0 0.0 0.0 810496.0 130073.9 271872.0 53990.9 71552.0 67042.8 8320.0 7480.3 19 0.259 5 0.845 1.104
常见参数
选项 | 作用 |
---|---|
-class | 类装载数量、卸载数量、总空间以及类状态所消耗时间 |
-gc | 监视Java堆容量状况,包括Eden、survivor、老年代、永久代等 |
-gccapacity | 监视Java堆最大、最小空间 |
-gcutil | 关注已使用空间占总空间的百分比 |
-gccause | 类似gcutil,额外输出上次GC的原因 |
-gcnew | 新生代GC状况 |
-gcnewcapacity | 与-gcnew类似,输出主要关注使用到的最大、最小空间 |
-gcold | 老年代GC状况 |
-gcoldcapacity | 与-gcold类似,输出主要关注使用到的最大、最小空间 |
-gcpermcapacity | 输出永久代使用到的最大、最小空间 |
-compiler | 输出JIT编译过的方法和耗时 |
-printcompilation | 输出已经被JIT编译的方法 |
-gcmetacapacity | 元数据空间统计 |
jinfo
实时查看和调整虚拟机各项参数。
选项 | 作用 | 案例 |
---|---|---|
-flag | 调整虚拟机参数 | jinfo -flag +PrintGCDetails 1479 |
-flags | 查看指定进程所有参数 | jinfo -flags 1479 |
-sysprops | 打印虚拟机进程系统内容 | jinfo -sysprops 1479 |
无参 | 打印所有 | jinfo 1479 |
例如
jinfo -flags 1479
输出
Attaching to process ID 1479, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.144-b01Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=4 -XX:InitialHeapSize=268435456 -XX:+ManagementServer -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=89128960 -XX:OldSize=179306496 -XX:TieredStopAtLevel=1 -XX:+TraceClassLoading -XX:+TraceClassUnloading -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC Command line: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51774,suspend=y,server=n -Dvisualvm.id=12693776008746 -Dserver.port=9988 -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=51773 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dfile.encoding=UTF-8
jmap
用于生成堆转储快照
- jmap -dump 1479,输出1479虚拟机的堆转储快照。
- -XX:+HeapDumpOnOutOfMemoryError 让虚拟机在出现OOM异常出现之后自动生成dump文件。
- linux系统下通过Kill -3 命令发送进行退出信息“吓唬”虚拟机输出dump文件。
命令如下
选项 | 作用 |
---|---|
-dump | 生成堆转储快照,格式为-dump:[live,]format=b,file=<filename>,不建议使用 |
-finalizerinfo | 显示在F-Queue中等待Finalizer线程执行finalize方法的对象 |
-heap | 显示java堆详细信息,回收器种类、参数配置、分代状况等 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量,会先触发GC,再统计信息,不建议使用 |
-permstat | 查看永久代内存状态,比较耗时,会暂停应用,不建议使用 |
-F | 强制生成dump快照,当-dump失效时,再使用此命令 |
例如
jmap -dump:format=b,file=/Users/gy/Desktop/test 1479
输出(成功) - 输出的文件比较大,我这里有320M
Dumping heap to /Users/gy/Desktop/test ...Heap dump file created
输出(失败) - 可以看出,没有权限访问,给目录权限或者换个有权限的目录。
Dumping heap to /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/bin/test ...Permission denied
jhat
虚拟机堆转储快照分析工具,这里分析jmap堆转储快照的文件
- 缺点:耗时、耗资源,一般不会再服务器上直接分析。一把使用其他工具,比如VisualVM。
jhat /Users/gy/Desktop/test
输出
Reading from /Users/gy/Desktop/test...Dump file created Tue Aug 28 15:59:30 CST 2018Snapshot read, resolving...Resolving 3208138 objects...Chasing references, expect 641 dots.......................Eliminating duplicate references..........................Snapshot resolved.Started HTTP server on port 7000Server is ready.
浏览器访问
jstack
Java堆栈跟踪工具,生成虚拟机当前时刻的线程快照(当前虚拟机内每一条线程正在执行的方法堆栈集合)
主要目的:定位线程出现长时间停顿的原因,如线程间死锁
、死循环
、请求外部资源导致的长时间等待
等。
选项 | 作用 | 案例 |
---|---|---|
-m | 如果调用本地方法,则显示C/C++的堆栈 | jstack -m 1479 |
-l | 除堆栈外,显示关于锁的附加信息 | jstack -l 1479 |
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 | jstack -F 1479 |
jconsole
# 启动./jconsole
- 概览
- 堆内存使用量
- 线程
- 类
- CPU占用率
- 内存
- 堆内存使用量
- 非堆内存使用量(方法区)
- 内存池“PS Old Gen”
- 内存池“PS Eden Space”
- 内存池“PS Survivor Space”
- 内存池“Metaspace”
- 内存池“Code Cache”
- 内存池“Compressed Class Space”
- 线程
- 线程数图表
- 所有线程
- 检查死锁
- 类
- 已加装当前类
- 已加载类总数
- 已卸载类总数
- VM概要
VM 概要2018年8月28日 星期二 下午01时59分33秒 CST连接名称: pid: 1479 com.raising.modules.DemoStartApplication虚拟机: Java HotSpot(TM) 64-Bit Server VM版本 25.144-b01供应商: Oracle Corporation名称: 1479@marshaldeMacBook-Pro.local运行时间: 1 小时 47 分钟进程 CPU 时间: 49.067 秒JIT 编译器: HotSpot 64-Bit Tiered Compilers总编译时间: 3.258 秒 活动线程: 98峰值: 101守护程序线程: 34启动的线程总数: 176已加装当前类: 11,092已加载类总数: 11,505已卸载类总数: 413当前堆大小: 129,701 KB最大堆大小: 3,728,384 KB提交的内存: 1,123,840 KB暂挂最终处理: 0对象垃圾收集器: 名称 = 'PS MarkSweep', 收集 = 5, 总花费时间 = 0.844 秒垃圾收集器: 名称 = 'PS Scavenge', 收集 = 19, 总花费时间 = 0.259 秒 操作系统: Mac OS X 10.13.3体系结构: x86_64处理程序数: 8提交的虚拟内存: 10,287,160 KB总物理内存: 16,777,216 KB空闲物理内存: 622,636 KB总交换空间: 1,048,576 KB空闲交换空间: 1,011,968 KB VM 参数: ...类路径: ...库路径: ...引导类路径: ...
- MBean
jvisualvm
- OQL控制台
- BTrace动态日志跟踪【插件】
博客
欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)