Java虚拟机的显微镜 Serviceability Agent 介绍

古代,习武之人都会找自己称心如意的兵器,悟空甚至远到龙宫去寻宝。刘关张结义之后马上 DIY 自己称手的兵器。

我们开发人员也是一样,我们在问题的分析诊断过程中,Debugging 和 Troubleshooting 工具起了很大的作用,有一个称手的工具,能节省大量的精力,快速解决原本需要耗费许久的工作。

当然,已经有大量的工具可以用于问题分析诊断,比如我们前面介绍过的两款:

Java七武器系列霸王枪 -- 线程状态分析 jstack

Java七武器系列孔雀翎-- 问题诊断神器BTrace

但比分析应用更底层的,Low Level 到 JVM 这一层级的工具却比较少。

比如有些时候,你在分析一个应用问题时,想要了解应用当前内存结构,加载类的内容,线程的 Stack Memory,死锁分析,存活对象统计和查询等等。

以上这些,用哪款工具比较合适呢?这些比较低层的分析,只能依靠 JVM 的支持,才能正确的分析。好在官方提供了这样一款工具。

这就是我们本次要提到的工具,或者准确来说是个工具集,但提供给我们使用时,类似于一站式的感觉。在一个工具里完成大量的需求,它是 Serviceability Agent,更多时候被称为 SA。

什么是SA?

The Serviceability Agent is a Sun private component in the HotSpot repository that was developed by HotSpot engineers to assist in debugging HotSpot. They then realized that SA could be used to craft serviceability tools for end users since it can expose Java objects as well as HotSpot data structures both in running processes and in core files.

概括来讲,这是Sun (Oracle)公司提供的一个用于分析HotSpot运行时和Core文件中数据的工具。可以 attach 到Java 进程或分析 Core文件中的数据,了解加载的 class,是一个包含大量 Java API 和工具的工具集。

而且,SA 在 attatch到 进程之后,会暂停当前进程的执行,拿到的是进程的一个 snapshot。当前进程会在 SA 断开后继续执行。

怎样使用

SA 在JDK中是以 Jar 文件的形式提供的,位于JAVA_HOME/lib/sa-jdi.jar。和一般的 Jar 文件执行一样。SA提供了两种使用方式

  •  GUI 方式的 HSDB 

  •  命令行的 CLIHSDB

例如我们使用GUI时,切换到该目录下,执行如下命令:

java -cp sa-jdi.jar sun.jvm.hotspot.HSDB

选择 File 菜单下的 Attach  to HotSpot Process,输入Java进程的pid即可。

此时,会看到进程的线程都在列表里展示了。

 顶部的一系列图标,可以查看选定线程的信息,例如能进行 Inspect,查看VM层面 线程对象的结构,选择 Stack Memory,查看 包含地址信息的stack 的数据。

后面是要以通过 Jstack拿到的Stack Trace。

在 Tools 菜单下,有一系列的工具。

我们选几个来简要介绍下。

Class Browser

通过这个,可以看到所有 JVM 加载的 class。对应类内的方法等信息自然也都能查到。它同时还支持把一个 class dump 到本地。这对于一些只能通过 core文件来分析问题的情况,可以拿到 class 来分析。

操作也简单,找到对应的class, 点击create class 就OK了, class 生成到lib目录下。

Find Object by Query

这个功能和 SQL类似,在文本框中输入要查询的对象

例如这个:

select t from java.lang.Thread t 

Code Viewer

对于一个类内的方法,有些时候需要分析方法的 JVM 指令或者 JIT 编译后的广场,可以使用这个工具,在输入 Class或者 Method的地址后,就会看到其对应的内容

Find Value in Heap

该工具可以在类似于 GC 问题时,通过指定对象的地址查看对象是否还存在于Heap中。

就像拥有长生剑的白玉京一样,多次在大仗中凯旋。

通过SA,我们不仅能分析到 Java 应用层面的东西,而且一些JVM 层面的,甚至 JIT 编译的方法, GC 是否回收对象,都能够很容易的了解到,仿佛一个JVM 的显微镜,在SA的协助下,问题都无处遁形。

相关阅读

80%的程序员都不了解的调试技巧

当我们谈Debug时,我们在谈什么(Debug实现原理)

类加载器与类冲突

觉得本文对你有帮助?请分享给更多人支持一下吧,谢谢

关注『 Tomcat那些事儿  』 ,发现更多精彩文章!了解各种常见问题背后的原理与答案。深入源码,分析细节,内容原创,欢迎关注。

发布了56 篇原创文章 · 获赞 0 · 访问量 7761

猜你喜欢

转载自blog.csdn.net/chainhou/article/details/105007766