这篇文章给大家介绍怎么解析Java虚拟机中的Serviceability Agent,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
我们在问题的分析诊断过程中,Debugging 和 Troubleshooting 工具起了很大的作用,有一个称手的工具,能节省大量的精力,快速解决原本需要耗费许久的工作。但比分析应用更底层的,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的协助下,问题都无处遁形。
关于怎么解析Java虚拟机中的Serviceability Agent就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。