JVM利器:Serviceability Agent介绍
本文首发于公众号:javaadu
简单介绍
构建高性能的java应用过程中,必然会遇到各种各样的问题,像cpu飙高、内存泄漏、应用奔溃,以及其他疑难杂症,这时可以使用serviceability agent(sa)。sa是jdk提供的一个强大的调试工具集,适用于语言层和虚拟机层,支持调试运行着的java进程、core文件和虚拟机crash之后的dump文件。
sa的优点:可以呈现出类对象、能够识别出java堆、堆边界、堆内对象、载入的类描述、栈内存、线程状态等信息。
安装
首先,我使用的操作系统版本是:macos 10.12.6进。sa提供了两个调试工具:图形化的调试工具(hsdb)和命令行工具(clhsdb)。这里我们演示下如何在mac下启动sa hsdb。
- 设置java_home变量:export java_home=/library/java/javavirtualmachines/jdk1.8.0_101.jdk/contents/home/
- sa hsdb的入口在$java_home/lib/sa-jdi.jar中,main方法在sun.jvm.hotspot.hsdb中,因此使用命令:sudo java -cp $java_home/lib/sa-jdi.jar sun.jvm.hotspot.hsdb,就可以启动hsdb调试器(入下图所示)
使用模式
单击左上角的file按钮可以看到:下拉框里指出了sa hsdb的三种使用模式:
- 链接到本地hotspot进程上;
- 链接到core文件;
- 连接到远程的服务器进行debug;
入门示例
这里我以自己维护的一个java应用为例,演示了sa hsdb最重要的一些功能。我在本地启动了该服务,使用jps -l
命令可以看到该服务的pid是51926,我使用第一种调试模式。
sa是快照调试器,因此,当在上图中点击ok的时候,account的java进程会被暂停,直到我们断开对该进程的调试,而sa hsdb显示的则是sa刚刚链接上account进程那个时间点的进程快照,入下图所示。
常用工具
左侧的下拉列表主要是一些常用的工具,分别介绍如下【其他功能暂时不常用,可以遇到问题了再研究】:
-
类浏览器(class browser):可以查看account的java进程中载入的类;遇到oom异常时,可以使用这个工具分析有哪些类是不需要载入的,当然,也可以分析希望载入但是没载入的情况;
死锁检测(deadlock detection):检测java代码层面的死锁,如果线程中存在死锁,则会显示线程死锁的信息和他们等待的锁;
-
对象检视器(interceptor):可以查看java线程对象的基本信息,也可以查看虚拟机内部的c++结构体信息;
-
对象直方图(object histogram):可以查看当前堆内存中对象的直方图,该工具在排查内存泄漏和oom类问题的时候非常有效
快捷图标
右侧的小窗口上面有四个图表,是一些快捷方式;分别介绍如下:
进程检视器:给出线程对象的vm中间表示形式(即开发者可以看懂的格式)
-
栈内存:显示选中进程的栈内存数据
- 左起第1栏是内存地址,请让我提醒一下本文里提到“内存地址”的地方都是指虚拟内存意义上的地址,不是“物理内存地址”,请不要弄混了这俩概念;
- 第2栏是该地址上存的数据,以字宽为单位,本文例子中我是在macos上跑64位的jdk8的hotspot vm,字宽是64位(8字节);
- 第3栏是对数据的注释,竖线表示范围,横线或斜线连接范围与注释文字
栈调用路径:显示线程的调用路径,可以看到方法名和地址,并能超链到方法的详细信息
线程的基本信息:包括线程状态、线程id等等
sa的其他工具
- finalizerinfo:该工具可用于打印出目标虚拟机所有可销毁对象的详细信息;
- heapdumper:该工具可以用hprof格式转储java堆的快照信息(类似于jmap命令);
- 永生代信息统计(permstat):该工具用于打印出目标虚拟机中永生代的统计信息;obje
- pmap:该工具用于打印出目标虚拟机进程的内存映射信息;
- 对象直方图(object histogram):对象直方图不仅可以在hsdb和clhsdb中使用,还可以单独使用;
- oql:该工具提供了类似脚本语言的命令,可以通过执行结构化对象查询语句,可以像写sql一样,在java堆中查找指定的对象;
- classdump:使用该工具可以导出目标虚拟机进程加载的类。
参考资料
- 《java性能调优指南》
- java serviceabilityagent(hsdb)使用和分析
- 借hsdb来探索hotspot vm的运行时数据
- java七武器系列长生剑 -- java虚拟机的显微镜 serviceability agent
本号专注于后端技术、jvm问题排查和优化、java面试题、个人成长和自我管理等主题,为读者提供一线开发者的工作和成长经验,期待你能在这里有所收获。
下一篇: 我国乡镇企业家的精神生活写实