虚拟机性能监控命令
本文是《深入理解java虚拟机》第四章 “虚拟机性能监控与故障处理工具” 笔记。
一 jdk 命令行工具
1 jps : 虚拟机进程状况工具;
jps [ options ] [ hostid ]
hostid机器需要启动jstatd 否则报错RMI Registry not available;
-q //输出LVMID(本地虚拟机进程pid)省略主类的名称
-m //输出虚拟机进程启动时传递给主类main()方法的参数;
-l //输出主类的全名,如果进程执行的是jar,输出jar路径;
-v //输出虚拟机进程启动时的jvm参数
2 jstat:虚拟机统计信息监视工具
jstat [option vmid [interval [s|ms] [count]]]
option--操作;
vmid--本地虚拟机进程,则vmid和lvmid相同都是pid,当是远程虚拟机进程,则为
[protocol:] [//] lvmid [@hostname[:port]]/servername
interval--查询间隔;
count--查询次数(如果没有interval和count, 则只查询一次)
-class // 监视类加载、卸载数量、总空间一级类加载所耗费的时间;
-gc //监视java堆状况、包括Eden,Survivor,老年代,永久代的容量、已用空间、GC时间合计等信息;
-gccapacity //类似gc,输出内容主要关注java堆各个区域使用的最大、最小空间;
-gcutil // 类似gc,输出主要关注已使用空间占总空间的百分比;
-gccause // 类似gcutil,但是会输出导致上一次GC产生的原因
-gcnew // 监视新生代GC情况
-gcold // 监视老年代GC状况
-gcnewcapacity // 类似gcnew 输出主要关注使用到的最大最小空间
-gcoldcapacity
-gcpermcapacity //永久代使用到的最大最小空间
-compiler //输出JIT编译器编译过的方法,耗时等
-printcompilation //输出已经被JIT编译的方法
3 jinfo:java虚拟机配置信息工具(jps可以查询启动设置的参数,但不包括默认的参数)
jinfo [option] pid
-sysprops // 打印System.getProperties()
-flag // 输出 flag后面参数的值 eg: jinfo -flag SurvivorRatio 4760
jdk1.6以上也可以使用java -XX:+PrintFlagsFinal查看参数默认值
4 jmap: java内存映像工具,可以获取dump文件,还可以查询finalize执行队列、java堆和永久代详细信息,空间使用率
或者当前使用的收集器等;
其中,dump文件也可以通过以下方法获取
(1) -XX:+HeapDumpOnOutOfMemoryError //在OOM异常时自动生成dump文件;
(2) -XX:+HeapDumpOnCtrlBreak //可使用ctrl+break键生成dump文件;
(3) linux下使用kill -3命令发送进程退出信号,生成dump文件;
jmap [option] vmid
-dump //生成java堆转储快照
-finalizerinfo //显示在F-Queue中等待Finalizer线程执行finalize方法的对象
-heap //显示java堆详细信息
-histo //显示堆中对象统计信息,包括类,实例数量,合计容量 windows可用
-permstat //以ClassLoader为统计口径显示永久代内存状态,仅linux/solaris可用
-F //当虚拟机进程对-dump无响应时,强制生成dump,仅linux/solaris可用
5 jhat:虚拟机堆转储快照分析工具 配合jmap分析jmap生成的堆转储快照,但功能比较简陋,且服务器内存消耗大,一般
将dump文件复制出来到其他机器上分析,使用更专业的VisualVM/Eclipse Memory Analyzer等工具;
6 jstack:java堆栈跟踪工具,用来生成虚拟机当前时刻的线程快照(称为threaddump或者javacore文件)
目的:定位线程出现长时间停顿的原因(线程间死锁、死循环、请求外部资源时间过长等)
jstack [option] vmid
-F //当正常输出的请求不被响应时,强制输出threaddump
-l //除堆栈外显示关于锁的附加信息
-m //如果调用到native方法,可以显示c/c++堆栈
扩展:jdk1.5后java.lang.Thread类新增getAllStackTraces()获取虚拟机所有线程的stackTraceElement对象,可以替换
实际项目可以使用它做个管理员页面,可以随时使用浏览器查看线程堆栈;
7 HSDIS: JIT生成代码反编译
二 jdk可视化工具
1 JConsole:java监视与管理控制台
启动:jconsole.exe
2 VisualVM:多合一故障处理工具
优点:功能强大,运行监控和故障处理、性能分析合一,对实际程序实际性能影响很小,可以直接在生产环境上使用;
基于NetBeans平台开发,所以具备插件扩展特性;
扩展后功能包括:
(1)显示虚拟机进程以及进程配置、环境信息;
(2) 监视应用程序CPU、GC、堆、方法区及线程信息;
(3) dump以及分析堆转储快照;
(4) 方法级别的程序运行性能分析,找出被调用最多、运行时间最长的方法;
(5) 离线程序快照:收集程序运行时的配置、线程dump、内存dump等建立快照,将快照发送给开发者进行bug反馈;
(6) 无限可能。。。
启动方法:jvisualvm.exe
在线或手动安装插件
profiler:性能分析,但是占用资源,一般不在生产环境使用;
BTrace:在不停止目标程序的情况下,动态加入原本不存在的调试代码,对生产环境问题定位有很大的作用;