第八章 JVM性能监控与故障处理工具(2)

注意:该篇博客主要记录自《深入理解java虚拟机(第二版)》

说明:关于命令行的JVM性能监控与故障处理工具见《第七章 JVM性能监控与故障处理工具(1)

1、图像化的故障处理工具

  • Jconsole
  • visualVM

2、Jconsole

进入"E:\Java\jdk1.6\bin",双击"jconsole.exe",弹出如下框:

说明:这里列出了所有的JVM进程,一个Jconsole进程,一个eclipse(PID:4684),这相当于jps命令。

选中其中一个PID,假设选中了eclipse,双击,出现下图:(注:之后的各个叶签,都是每4秒刷新一次)

"内存":相当于jstat -gc,在上图中的详细信息部分,该部分对应的信息就是头部图表部分所写的参数(这里是"整个堆"的情况),同时对应的也是右下角部分柱状图所选中的柱子(这里是"堆"),对于"非堆"指的就是"方法区"(或者称为"永久代")。当然,这里也可以选择时间范围来查看相应的信息。

"类":相当于jstat -class,列出了装载类和卸载类的相关信息。

"线程":相当于jstack,折线图显示了线程数目的变化情况,包括峰值线程数量、活动线程数量;左下角展示了所有线程名称。双击相应的线程名称

"VM摘要":相当于jinfo

最后,测试一下线程死锁的现象。代码如下:

 1 package thread;
 2
 3 /**
 4  * 测试线程
 5  */
 6 class XXthread implements Runnable{
 7     int a,b;
 8
 9     public XXthread(int a, int b) {
10         this.a = a;
11         this.b = b;
12     }
13
14     public void run() {
15         synchronized (Integer.valueOf(a)) {
16             synchronized (Integer.valueOf(b)) {
17                 System.out.println(a + b);
18             }
19         }
20     }
21 }
22
23 public class TestDeadLockThread {
24     public static void main(String[] args) {
25         for(int i=0;i<100;i++){
26             new Thread(new XXthread(1, 2)).start();
27             new Thread(new XXthread(2, 1)).start();
28         }
29     }
30 }

执行main()方法,之后去查看"线程"标签,点击"检测死锁",如下:

发现线程Thread-95和Thread-106死锁(彼此拥有对方想要的锁)

分析:

1)Integer缓存机制

Integer.valueOf(int xxx),该方法为了减少对象的创建,节省内存,会将xxx转化成的Integer对象缓存起来,之后只要是相同的xxx,那么这个方法都会直接从缓存中取出对象来。假设代码中的Integer.valueOf(1)生成的对象是[email protected],而Integer.valueOf(2)生成的对象是[email protected],那么之后无论调用多少次Integer.valueOf(1),也无论是哪一个线程去调用该方法,返回的都只是同一个对象[email protected]。也就是说上边的这段代码中的Integer.valueOf(i)只会生成两个不同的对象,就是[email protected]和[email protected],而这两个对象也就是我们的锁对象。

2)死锁发生的时机

假设线程"Thread-95"执行到其第一个synchronized块中时(假设刚刚获取了锁对象[email protected]),这时候CPU时间片切换给了线程"Thread-106",而"Thread-106"执行其第一个synchronized块(获取了锁对象[email protected]),之后"Thread-106"要执行第二个synchronized块儿来获取锁对象[email protected],这时候就获取不到了,因为这个锁对象正被"Thread-95"所持有,于是"Thread-106"就阻塞在[email protected]这个锁对象上,这时,假设CPU时间片又切换给了"Thread-95",该线程要执行第二个synchronized块来获取[email protected],就获取不到了,因为该锁对象已被"Thread-106"所持有

3)结果

"Thread-95"持有锁对象[email protected],阻塞在锁对象[email protected];

"Thread-106"持有锁对象[email protected],阻塞在锁对象[email protected]

3、visualVM

是一块更加全面的GUI监视工具,包含很多插件(需要自己下载),具体的见《深入理解Java虚拟机(第二版)》

时间: 2024-12-23 22:48:41

第八章 JVM性能监控与故障处理工具(2)的相关文章

【008】【JVM——性能监控与故障处理工具】

 JVM--性能监控与故障处理工具 HotSpot虚拟机提供了许多虚拟机运行时调试工具,方便开发人员在应用运行时对虚拟机和应用性能进行监控和优化. jps:JVM Process Status Tool 显示指定系统内所有的HotSpot 虚拟机进程.并显示虚拟机执行主类(Main Class, main()函数所在的类)的名称,以及这些进程的本地虚拟机的唯一ID ( LVMID, Local Virtual Machine Identifier) . jps 命令格式:jps [ opti

JVM性能监控与故障处理工具

jdk为我们提供了一系列的jvm性能监控和故障处理工具,在这里根据学习进度进行整理记录.便于之后查阅 1.jps 虚拟机进程工具  类似于Linux系统中的ps命令,用于查看虚拟机进程,常用的有以下功能 jps -l    显示虚拟机进程id以及进程主类 jps -q  只显示进程id,不显示主类名称 jps -m  显示进程id以及传递给main的参数 jps -v 输出虚拟机进程启动时的jvm参数 2.jstat 虚拟机统计信息监视工具 该工具是用于监视虚拟机各种运行状态信息的命令行工具  

第七章 JVM性能监控与故障处理工具(1)

1.定位系统问题 依据 GC日志 堆转储快照(heapdump/hprof文件) 线程快照(threaddump/javacore文件) 运行日志 异常堆栈 分析依据的工具 jps:显示指定系统内的所有JVM进程 jstat:收集JVM各方面的运行数据 jinfo:显示JVM配置信息 jmap:形成堆转储快照(heapdump文件) jhat:分析heapdump文件 jstack:显示JVM的线程快照 jconsole visualVM 说明:后边两种是具有图形化界面的. 2.jps(是其他所

JVM(4) 虚拟机性能监控与故障处理工具

1. Sun JDK 监控和故障处理工具 1)jps:JVM process Status Tool,显示指定系统内所有的HotSpot虚拟机进程.可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类) 的名称,以及这些进程的本地虚拟机的唯一ID 2)jstat:JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据.是用于监视虚拟机各种运行状态信息的命令行工具.它可以显示本地或远程(需要远程 主机

004 虚拟机性能监控与故障处理工具

工具位于 JDK下bin中 1.JDK的命令行工具 监控和故障处理工具 ① jps:虚拟机进程状况工具 jsp命令格式: jps[options][hostid] jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名.jps的其他常用选项见下表. ② jstat:虚拟机统计信息监视工具 jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具.它可以显示本地或者远程虚拟机进程中的类

《深入理解Java虚拟机》虚拟机性能监控与故障处理工具

上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念,才能继续往下学习. 本节学习重点 本节主要是针对JVM内存管理机制的一些监控手段,例如堆情况使用的监控,线程栈情况的监控等.有几句废话还是有必要在这里强调的,工具是人类思维的工具,例如Java语言是人类满足需求的一种技术手段,而监控工具只是维护程序应用的一种手段.所以,思考的逻辑思维要清晰,是问题引导工具,

虚拟机性能监控与故障处理工具

Sun SDK 监控和故障处理工具 jps 虚拟机进程状况工具 格式 jps [option] [hostid] 本地虚拟机唯一ID: local virtual machine identifier,LVMID 进程ID:process identifier jps可以通过RMI 协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI 注册表中的注册的主机名. 主要参数 -q                                                      

【JVM.3】虚拟机性能监控与故障处理工具

一.概述 经过前面两章对于虚拟机内存分配与回收技术各方面的介绍,相信读者已经建立了一套比较完整的理论基础.理论总是作为指导实践的工具,能把这些执行应用到实际工作中才是我们的最终目的.接下来我们会从实践的角度去了解虚拟机内存管理的世界. 二.JDK的命令行工具 Java开发人员肯定都知道JDK的bin目录中的"java.exe"."javac.exe"这两个命令行工具,对并非所有程序员都了解JDK的bin目录之中其他命令行程序的作用.每逢JDK更新版本时,bin目录下

Java虚拟机8:虚拟机性能监控与故障处理工具

http://www.cnblogs.com/xrq730/p/4842483.html 前言 定位系统问题的时候,知识.经验是基础,数据是依据,工具是运用知识处理数据的手段.这里说的数据包括:运行日志.异常堆栈.GC日志.线程快照.堆转储快照等.经常使用适当的虚拟机监控和分析的工具可以加快分析数据.定位解决问题的速度. jps:虚拟机进程状况工具 首先约定一下运行的代码都是以下这段 1 public class TestMain 2 { 3 public static void main(St