Serviceability Agent介绍简单介绍安装使用模式入门示例SA的其他工具参考资料

本文首发于个人网站:Serviceability Agent介绍

简单介绍

构建高性能的Java应用过程中,必然会遇到各种各样的问题,像CPU飙高、内存泄漏、应用奔溃,以及其他疑难杂症,这时可以使用Serviceability Agent(SA)。SA是JDK提供的一个强大的调试工具集,适用于语言层和虚拟机层,支持调试运行着的Java进程、core文件和虚拟机crash之后的dump文件。

SA的优点:可以呈现出类对象、能够识别出Java堆、堆边界、堆内对象、载入的类描述、栈内存、线程状态等信息。

安装

首先,我使用的操作系统版本是:macOS 10.12.6进。SA提供了两个调试工具:图形化的调试工具(HSDB)和命令行工具(CLHSDB)。这里我们演示下如何在Mac下启动SA HSDB。

  1. 设置JAVA_HOME变量:export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/
  2. 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调试器(入下图所示)

2017-12-1421.24.53.png

使用模式

单击左上角的File按钮可以看到:下拉框里指出了SA HSDB的三种使用模式:

  1. 链接到本地Hotspot进程上;
  2. 链接到core文件;
  3. 连接到远程的服务器进行Debug;

2017-12-1421.24.44.png

入门示例

这里我以自己维护的一个Java应用为例,演示了SA HSDB最重要的一些功能。我在本地启动了该服务,使用jps -l命令可以看到该服务的PID是51926,我使用第一种调试模式。

2017-12-1422.10.09.png

SA是快照调试器,因此,当在上图中点击OK的时候,account的Java进程会被暂停,直到我们断开对该进程的调试,而SA HSDB显示的则是SA刚刚链接上account进程那个时间点的进程快照,入下图所示。

2017-12-1422.16.52.png

常用工具

左侧的下拉列表主要是一些常用的工具,分别介绍如下【其他功能暂时不常用,可以遇到问题了再研究】:

  1. 类浏览器(Class Browser):可以查看account的Java进程中载入的类;遇到OOM异常时,可以使用这个工具分析有哪些类是不需要载入的,当然,也可以分析希望载入但是没载入的情况;

2017-12-1422.48.50.png

  1. 死锁检测(Deadlock Detection):检测Java代码层面的死锁,如果线程中存在死锁,则会显示线程死锁的信息和他们等待的锁;
  2. 对象检视器(Interceptor):可以查看Java线程对象的基本信息,也可以查看虚拟机内部的C++结构体信息;

2017-12-1422.50.11.png

  1. 对象直方图(Object Histogram):可以查看当前堆内存中对象的直方图,该工具在排查内存泄漏和OOM类问题的时候非常有效

2017-12-1422.45.11.png

快捷图标

右侧的小窗口上面有四个图表,是一些快捷方式;分别介绍如下:

  1. 进程检视器:给出线程对象的VM中间表示形式(即开发者可以看懂的格式)
  2. 栈内存:显示选中进程的栈内存数据

2017-12-1421.48.43.png

  • 左起第1栏是内存地址,请让我提醒一下本文里提到“内存地址”的地方都是指虚拟内存意义上的地址,不是“物理内存地址”,请不要弄混了这俩概念;
  • 第2栏是该地址上存的数据,以字宽为单位,本文例子中我是在macOS上跑64位的JDK8的HotSpot VM,字宽是64位(8字节);
  • 第3栏是对数据的注释,竖线表示范围,横线或斜线连接范围与注释文字

  1. 栈调用路径:显示线程的调用路径,可以看到方法名和地址,并能超链到方法的详细信息
  2. 线程的基本信息:包括线程状态、线程ID等等

SA的其他工具

  1. FinalizerInfo:该工具可用于打印出目标虚拟机所有可销毁对象的详细信息;
  2. HeapDumper:该工具可以用hprof格式转储Java堆的快照信息(类似于jmap命令);
  3. 永生代信息统计(PermStat):该工具用于打印出目标虚拟机中永生代的统计信息;Obje
  4. PMap:该工具用于打印出目标虚拟机进程的内存映射信息;
  5. 对象直方图(Object Histogram):对象直方图不仅可以在HSDB和CLHSDB中使用,还可以单独使用;
  6. OQL:该工具提供了类似脚本语言的命令,可以通过执行结构化对象查询语句,可以像写SQL一样,在Java堆中查找指定的对象;
  7. ClassDump:使用该工具可以导出目标虚拟机进程加载的类。

参考资料

  1. 《Java性能调优指南》
  2. Java ServiceabilityAgent(HSDB)使用和分析
  3. 借HSDB来探索HotSpot VM的运行时数据
  4. Java七武器系列长生剑 -- Java虚拟机的显微镜 Serviceability Agent

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

一篇文章带你梳理Python Django的正确的学习方法!

? 作者:地球的外星人君 来源: https://www.zhihu.com/question/26235428/answer/170250328 Djang...

2946
来自专栏游戏杂谈

Linux下使用rsync同步文件

遇到的问题是几台游戏服务器,有一台新的服务器之前已经copy(Linux的scp命令)过文件上去,但在测试的过程中发现还是图片无法正常不显示出来,然后用http...

3352
来自专栏码洞

RPC 服务器之【多进程描述符传递】高阶模型

今天老师要给大家介绍一个比较特别的 RPC 服务器模型,这个模型不同于 Nginx、不同于 Redis、不同于 Apache、不同于 Tornado、不同于 N...

1282
来自专栏张戈的专栏

启用WP Super Cache纯代码版本之后的一些优化措施

张戈博客在上个月 28 号启用了 WP Super Cache 代码版,几天下来,虽然小问题不断,但是总体感觉非常不错!不管是前台还是后台,速度都有质的提升,着...

3637
来自专栏从零开始学自动化测试

pytest文档18-配置文件pytest.ini

pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件,读取配置信息,按指定的方式去运行。

9192
来自专栏守望轩

Visual Studio 2008 每日提示(九)

本篇包括tip80-tip91 //www.watch-life.net/visual-studio/visual-studio-2008-tip-day-9...

3648
来自专栏零基础使用Django2.0.1打造在线教育网站

零基础使用Django2.0.1打造在线教育网站(十四):用户密码找回

努力与运动兼备~~~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!

2941
来自专栏小狼的世界

使用Fusioncharts实现后台处理进度的前台展示

关于第一个问题,不是本文的重点,简单说一下思路。因为HTTP协议实际上是无状态的协议,前台的请求提交给后台之后,一般情况下都是后台处理完成才会向前台返回处理结果...

991
来自专栏hbbliyong

WCF配置文件与文件下载之坎坷路

题外话:本以为我会WCF了,精通WCF了,毕竟刚做过一个WCF的项目,不就是写写契约接口,然后实现接口,改下配置。最后用控制台或者服务发布一下,不就能用了。不...

3227
来自专栏祥子的故事

python | os包常用命令介绍

3835

扫码关注云+社区

领取腾讯云代金券