基础故障处理工具
jps: 虚拟机进程状况工具
功能:来处正在运行的虚拟机进程,并显示虚拟机执行主类名称,以及本地虚拟机唯一ID。
它是使用频率最高的命令行工具,因为其他JDK工具大多需要输入他查询到的LVMID来确定要监控的是哪一个虚拟机进程。对于本地虚拟机进程,LVMID就是操作系统的进程ID,但是如果启动了多个虚拟机进程,无法根据进程名称来定位时3,就必须依赖jps命令显示主类的功能才能区分了。
格式:
jps [ options ] [ hostid ]
参数对应的作用。
jstat:虚拟机统计信息监控工具
功能:用于监视虚拟机各种运行状态(类加载、内存、垃圾收集、即时编译)信息的命令行工具。
在存文本控制台环境的服务器上,他是运行期定位虚拟机性能问题的常用工具。
jstat格式:
jstat [ option vmid [interval[s|ms] [count]] ]
vmid在本地虚拟机中和LVMID一致,如果是远程的虚拟机进程,
格式是:[protocol:][//]lvmid[@hostname[:port]/servername]
option参数分为三类:类加载,垃圾收集、运行期编译状况。
例如:查看虚拟机进程2764的垃圾收集的具体状况。
java -gcutil 2764
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 6.20 41.42 47.20 16 0.105 3 0.472 0.577
S0,S1分别是Survivor0,Survivor1,里面是空的,老年代O代表Old,永久代P代表Permanent,分别使用了41.42%,47.20%空间。YGC就是年轻代GC,一共发生了16次,耗时0.105s,FGC老年代GC发生了3次,耗时0.472s,GCT代表GC一共花费了0.577s。
jinfo:Java配置信息工具
功能:实时查看和调整虚拟机各项参数。使用jps命令的-v参数可以查看虚拟机启动时显示指定的参数列表,但是如果想要知道未被显示指定的参数的系统默认值,除了查询其他资料,只剩使用jinfo -flag选项进行查询了。
jinfo命令格式:
jinfo [option] pid
例如查询CMS触发百分比的参数值
jinfo -flag CMSInitiatingOccupancyFraction 1444
-XX:CMSInitiatingOccupancyFraction=85
jmap:Java内存映像工具
功能:用于生成对转储快照(dump文件或者叫做heap dump)。还可以查询finalize执行队列、Java堆和方法区的详细信息。
其实不使用jmap,也能转储对快照,使用 -XX:+HeapDumpOnOutOfMemoryError
参数,可以让虚拟机在内存溢出后自动生成堆转储快照文件。也可以用 kill -3向进程发出退出信号,也能获取堆转存快照。
jmap命令格式:
jmap [option] vmid
可选参数如下图所示
使用jmap生成dump文件,其中3500是通过jps查询到的本地虚拟机进程ID(LVMID)
jmap -dump:format=b,file=eclipse.bin 3500
Dumping heap to C:UsersIcyFenixeclipse.bin ...
Heap dump file created
jhat:虚拟机堆转储快照分析工具
功能:JDK提供jhat(Java Heap Analysis Tool)命令是和jmap命令配合使用,用来分析jmp生成的dump文件。
jhat内置一个微型的web服务器,生成分析结果后,可以在浏览器中查看,输入http://localhost:7000
,不过不会在虚拟机运行的那台机器上用jhat分析堆转储快照,因为分析锁消耗的内存资源太大,一般会将dump文件转到其他机器上然后在用jhat分析,不过现在有比jhat更好用的分析功能。VisualVM,以及IBMHeapAnalyzer等。
使用格式:
jhat eclipse.bin
....
Server is ready.
jstack: Java堆栈跟踪工具
功能:用于生成虚拟机当前时刻的线程快照(thereaddump或者javacore文件)。
为什么要生成线程快照?其实就是说生成线程快照的作用。
为了定位线程长时间处于停顿的原因,如遇上了死循环,死锁,请求外部资源时间过长没收到响应等。通过jstack命令可以获知没有响应的线程在后台干了什么事。
jstack 格式:
jstack [option] vmid
可选参数的作用;
可视化故障处理工具
JHSDB:基于服务性代理的调试工具
JHSDB是一款基于服务性代理的进程外部调试工具。服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言实现的API集合。它可以在独立的虚拟机的进程里分析其他虚拟机的内部数据。或者从进程内存快照中还原出他的运行细节。通过JHSDB可以找到代码中创建的对象所在的位置以及他们的引用在哪。
JConsole: Java监视与管理控制台
JConsole是一款基于JMX的可视化监视、管理工具。主要工作是通过JMX(Java Manage-ment Extensions)的MBean对系统进行信息收集和参数动态调整。而JMX是一种开放的技术,即可以用在虚拟机本身也可以用在虚拟机软件上。
启动JConsole
进入JDK/bin目录下,通过jconsole.exe启动JConsole,系统会自动搜索出本机运行的所有虚拟机进程。
内存监控
内存页签的作用相当于可视化的jstat命令,用于监视被收集器管理的虚拟机内存的变化趋势。
线程监控
点击线程标签的功能就相当于可视化jstack命令,与当了线程挺短的情况可以使用这个标签来进行分析。
VisualVM:多合-故障处理工具
VisualVM是功能最强大的运行监视和故障处理程序之一。他除了常规的运行监视、故障处理还提供了性能监分析的功能。并且它还支持大量的扩展,可以安装多数插件。
有了插件,VisualVM可以做到:
- 显示虚拟机进程以及进程的配置、环境信息。
- 监视应用程序的处理器、垃圾收集、堆、方法区以及线程的信息。
- 堆转存快照分析
- 方法级的程序运行性能分析,找出被调用最多。运行时间最长的方法。
- 离线程序快照:收集程序的运行时配置、线程dump、内存dump等信息建立一个快照,可以将快照发送开发者处进行bug反馈。
这玩意是在JDK6 Update7中首次发布,但并不意味着他只能在JDK6及以上运行,它具有向下兼容的特性,能兼容JDK1.4.2版本。
刚开始VisualVM没有任何插件,所以先安装插件才能实现基本的功能。
手工安装插件并不常用,VisualVM的自动安装功能已可找到大多数所需的插件,在有网络连接的环境下,点击“工具->插件菜单”,弹出插件页签,在页签的“可用插件”及“已安装”中列举了当前版本VisualVM可以使用的全部插件,选中插件后在右边窗口会显示这个插件的基本信息,如开发者、版本、功能描述等。
Java Mission Control:可持续在线的监控工具
持续收集数据的JFR(Java Fight Recoder)和运行监控Java虚拟机的JMC(Java Mission Control)。
JFR是一套内嵌在HotSpot虚拟机里面的金控和基于事件的信息收集框架,在于其他的监控工具相比,JFR在生产环境中对吞吐量的影响不超过1%,并且JFR监控过程的开始和结束都是动态的,不需要重启应用。
JMC不经可以下载到独立程序,还可以作为Eclipse的插件直接使用。它与虚拟机之间采用JMX协议进行通信,一方面用来显示虚拟机MBean提供的数据,另一方面用来作为JFR的分析工具展示JFR的数据。
JFR与JMC的配合相当于录屏软件与超级播放器的组合,JFR会对选择的虚拟机(可以是本地的也可以是远程的)运行的整个过程都会保存成日志,保存到内存或者是某个文件中,然后JMC从内存或者文件中读取并展示这些事件数据,还能进行性能分析。
以垃圾搜集为例,HotSpot的MBean中一般有各个分代大小、收集次数、时间、占用率等数据(根据收集器不同有所差别),这些都属于“结果”类的信息,而JFR中还可以看到内存中这段时间分配了哪些对象、哪些在TLAB中(或外部)分配、分配速率
和压力大小如何、分配归属的线程、收集时对象分代晋升的情况等,这些就是属于“过程”类的信息,相比于结果类信息过程信息更加准确有效的分析问题。
来自《深入理解Java虚拟机第三版 周志明著》