概述
虚拟机性能监控和故障处理工具
思维导图
1.jps:虚拟机进程状况工具
作用:列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID。
LVMID与操作系统的进程PID是一致的,使用Windows的任务管理器或UNIX的ps命令也可以查到虚拟机进程的LVMID。
jps -q:只输出LVMID,省略主类的名称
jps -m:输出虚拟机进程启动时传递给主类main()函数的参数
jps -l:输出主类的全名,如果进程执行的是jar包,输出Jar路径
jps -v:输出虚拟机进程启动时JVM参数
2.jstat:虚拟机统计信息监视工具
jstat是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
jstat命令格式:jstat [ option vmid [interval[s|ms] [count]] ]
option代表用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集器、运行期编译情况。
在jdk1.8中,关于永久代变为gcmetacapacity
MCMN:最小元数据容量,MCMX:最大元数据容量,MC:当前元数据空间大小,CCSMN:最小压缩类空间大小,CCSMX:最大压缩类空间大小,CCSC:当前压缩类空间大小,YGC:年轻代垃圾回收次数,FGC:老年代垃圾回收次数,FGCT:老年代垃圾回收消耗时间,GCT:垃圾回收消耗总时间。
jstat输出样例:
其中 S0 和 S1 指 Survivor0 区和 Survivor1区,E 即 Eden 区,O 指老年代,M 指 MetaSpace,元数据空间,CCS 是压缩使用比例,YGC:年轻代垃圾回收次数,FGC:老年代垃圾回收次数,FGCT:老年代垃圾回收消耗时间,GCT:垃圾回收消耗总时间。
3.jinfo:Java配置信息工具
jinfo(Configuration Info for Java):实时地查看和调整虚拟机各项参数。虽然 jps -v 可以查看虚拟机启动时显式指定的参数,但是无法查看一些系统默认的参数。
jinfo 命令格式:jinfo [option] pid
4.jmap:Java内存印象工具
jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件)。
其他可以生成heapdump的方法:
- 使用
-XX:+HeapDumpOnOutOfMemoryError
参数,可以让虚拟机在OOM异常出现之后自动生成dump文件 - 使用
-XX:+HeapDumpOnCtrlBreak
参数则可以使用Ctrl+Break键让虚拟机生成dump文件 - 在Linux系统下通过Kill -3命令发送进程退出信号“吓唬”一下虚拟机,也能拿到dump文件
jmap还可以查询finalize执行队列、Java堆和永久代的详细信息。
jmap命令格式:jamp [ option ] vmid
options可以为:
5.jhat:虚拟机堆存储快照分析工具
jhat(JVM Heap Analysis Tool)用于分析 jmap 生成的 heapdump。其内置了一个微型的 HTTP 服务器,可以在浏览器查看分析结果。
实际很少用 jhat,主要有两个原因:
- 分析工程会耗用服务器资源
- 功能相对 BisualVM、IBM HeapAnalyzer 较为简陋
演示:
在浏览器中输入http://localhost:7000/
6.jstack:Java堆栈跟踪工具
jstack命令可以用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。javacore主要目的是定位线程出现长时间停顿的原因,比如死锁,死循环、请求外部资源响应长等。另外JDK1.5后Thread类新增了getAllStackTraces()
方法,可以基于此自己增加管理页面来分析。
jsatck命令格式:jstack [ options ] vmid,其options:
演示:(只截取了一部分)
7.HSDIS:JIT生成代码反汇编
现代虚拟机的实现慢慢地和虚拟机规范产生差距,如果要分析程序如果执行,最常见的就是通过软件调试工具(GDB、Windbg等)断点调试,但是对于 Java 来说,很多执行代码是通过 JIT 动态生成到 CodeBuffer 中的。
HSDIS 是官方推荐的 HotSpot 虚拟机 JIT 编译代码的反汇编工具,它包含在 HotSpot 虚拟机的源码中,但没有提供编译后的程序,可以自己下载放到 JDK 的相关目录里。它作用是让 HotSpot 的 -XX:+PrintAssembly
指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成大量有价值的注释。
结果如下:
JDK可视化工具
JConsole:Java监视与管理控制台
JConsole是一种基于JMX的可视化监视、管理管理。他管理部分的功能是针对JMX MBean进行管理,由于MBean可以使用代码、中间件服务器的管理控制台或者所有符合JMX规范的软件进行访问,这里着重介绍JConsole的监视部分的功能。
启动JConsole
通过JDK/bin目录下的“jconsole.exe”启动JConsole,会自动搜索本机的所有虚拟机进程:
双击选择本地进程,进入主界面,包括“概述”、“内存”、“线程”、“类”、“VM 摘要”、“MBean”,6个页面:
其中,概述显示整个虚拟机主要运行数据的概览,包括对内存使用情况,线程,类,CPU使用情况,4中信息的曲线图。
内存监控
内存页签相当于可视化的jstat命令,用于监视受收集器管理的虚拟机内存的变化趋势。
JConsole监视:
演示代码:以64KB/50ms的速度往Java堆中填充数据,一共填充10000次,使用“内存”页进行监视,观察曲线和柱状图的变化。
import java.util.ArrayList;
import java.util.List;
public class OOMObject {
static class OOMObject1{
public byte[] placeholder = new byte[64 * 1024];
}
public static void fillHeap(int num) throws InterruptedException{
List<OOMObject1> list = new ArrayList<OOMObject1>();
for(int i = 0; i < num; i++){
Thread.sleep(50);
list.add(new OOMObject1());
}
System.gc();
}
public static void main(String[] args) throws Exception{
fillHeap(10000);
}
}
监视结果:
线程监控
线程页签相当于可视化的 jstack 命令,遇到线程停顿时可以使用这个页签进行监控分析。
线程等待演示代码:
package xiancheng;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class createBusyThread {
public static void createBusyThread1(){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true);
}
}, "testBusyThread");
thread.start();
}
public static void createLockThread(final Object lock){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock){
try{
lock.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}, "testLockThread");
thread.start();
}
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
createBusyThread1();
br.readLine();
Object obj = new Object();
createLockThread(obj);
}
}
线程死锁演示代码:
package xiancheng;
public class createDeadLock {
static class SynAddRunable implements Runnable{
int a, b;
public SynAddRunable(int a, int b){
this.a = a;
this.b = b;
}
@Override
public void run() {
synchronized (Integer.valueOf(a)){
synchronized (Integer.valueOf(b)){
System.out.println(a + b);
}
}
}
}
public static void main(String[] args) {
for(int i = 0; i < 100; i++){
new Thread(new SynAddRunable(1,2)).start();
new Thread(new SynAddRunable(2,1)).start();
}
}
}
JConsole检测死锁;
由检测结果可知:Thread98
在等待一个被线程Thread103
持有Integer对象,而Thread103
在等待一个被线程Thread98
持有的Integer对象,这两个线程就互相卡住,都不存在等到锁释放的希望了。
VisualVm:多合一故障处理工具
VIsualVM(All-in-One Java Troubleshooting Tool)是目前为止JDK发布的功能最强调的运行监控和故障处理程序,另外还支持性能分析,它还有一个很大的优点:不需要被监视的程序基于特殊 Agent 运行,因此对应用程序的实际性能影响很小,可直接应用在生成环境中。
VisualVM 是基于 NetBeans 平台开发,具备插件扩展功能的特性,基于插件可以做到:
- 显示虚拟机进程以及进程配置、环境信息(jps、jinfo)
- 监视应用程序的 CPU、GC、堆、方法区以及线程的信息(jstat、jstack)
- dump 以及分析堆转储快照(jmap、jhat)
- 方法级的程序运行性能分析,找出被调用最多运行时间最长的方法
- 离线程序快照(收集运行时配置、线程 dump、内存 dump 等信息建立快照)
- 其他 plugins 的无限可能
可以自动安装插件(也可手工安装):
VisualVM 功能:
- 可以生成浏览堆转储快照(摘要、类、实例标签页、OQL 控制台)
- 分析程序性能(Profiler 页签可以录制一段时间程序每个方法执行次数和耗时)
- BTrace 动态日志跟踪(不停止目标程序运行的前提下通过 HotSwap 技术动态加入调试代码)
小结
本章介绍了随 JDK 发布的 6 个命令行工具以及 2 个可视化的故障处理工具,灵活运行这些工具可以给问题处理带来很多便利。
参考资料
- 周志明. 深入理解Java虚拟机 : JVM高级特性与最佳实践 : Understanding the JVM : advanced features and best practices[M]. 机械工业出版社, 2013.
借鉴模仿了陈辰学长的博客内容格式,收益颇多。
最后
以上就是孝顺鸡翅为你收集整理的【JVM】JVM二刷(四)_虚拟机性能监控和故障处理工具虚拟机性能监控和故障处理工具思维导图小结参考资料的全部内容,希望文章能够帮你解决【JVM】JVM二刷(四)_虚拟机性能监控和故障处理工具虚拟机性能监控和故障处理工具思维导图小结参考资料所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复