sa-jdi.jar

sa-jdi.jar是HotSpot自带的底层调试支持,Serviceability Agent的实现。它的来龙去脉请参考2001年的一篇报告:http://static.usenix.org/event/jvm01/full_papers/russell/russell_html/

SA意义上的agent跟JVMTI/Java agent不是同一个层次上的。

现有的SA实现只支持“snapshot”式的使用方式,也就是
1、通过系统级调试API将一个活的目标进程暂停下来,将SA连接上去,做分析,做完之后将SA断开连接,然后恢复目标进程的正常运行;
2、打开core dump,利用SA来分析里面的内容。也就是事后分析(postmortem)。

“snapshot”是指,上面这两种使用场景都不支持在SA保持连接的同时让目标进程运行。

我是经常会用到CLHSDB的,但通常Java应用层的开发不会直接用它吧。
SA系的工具可以很方便的抓取到JVM层面的信息,相对Java应用来说这就是“底层信息”了。当然对应用来说也可以派上用场,例如淘宝的同事叔同写的这个:TBJMap“增强版jmap”,或者我之前写的这玩儿的原型https://gist.github.com/1551013,又例如我写的用来显示NIO direct memory使用状况的工具:https://gist.github.com/1593521

SA里自带工具大部分都通过JDK的工具命令暴露出来了,例如jmap、jstack这些的某些选项的功能就是通过SA来实现的。

以前在淘宝的时候,我们的生产环境上要连接/拔下一个空的SA系工具大概要300ms。如果要额外捞点“位置固定”的数据那花不了多少时间。但如果要遍历GC堆的话花上几秒甚至几分钟都是完全正常的。生产环境上要小心使用。

关于文档:CLHSDB的文档在这里有 http://hg.openjdk.java.net/jdk7u/jdk7u6/hotspot/file/7566374c3c89/agent/doc/
而SA系的内部更细节的地方就没文档了。只有源码。上文提到的论文是除了源码之外最好的入门途径。

===================================================

可能有人留意到了JDK自带的那些工具中,有好些都是有两种实现的。以jstack为例,默认参数下它用的是attach API,也就是楼主说的tools.jar里的那边;使用了-F或-m,或者是对core dump来使用的时候,它用的就是SA系的实现。

这俩最大的区别是,attach API是“in-process”,而SA是“out-of-process”的。如果对调试器的实现方式熟悉的话这俩名词应该不会陌生。张银奎在《程序 员》杂志上连载的“调试之剑”专栏的2011年1、2月两期讲CLRv4的调试架构重构的时候正好也提到了这俩概念,可以参考。

简单来说,in-process就是调试器(或类似的功能)运行在目标进程内,而out-of-process是调试器跟目标进程是独立的两个进程,通过进程间通信来实现调试。

前者的重要好处是不依赖底层(特别是操作系统提供的调试API)所以容易移植,而且运行速度较快(因为访问数据的时候是在同进程内的)。但缺点也很明显:调试功能自身容易干扰到被调试目标,形成“海森堡效应”。
例如说,本来要用jstack看一个Java程序的所有Java线程的栈,attach API的实现方式是:
1、客户端连接到目标JVM,向其发出一个“threaddump”文本命令;
2、目标JVM接收到这个命令,执行JVM内的一个thread_dump()函数,将收集到的结果以文本形式返回
3、客户端接收到返回的文本并将其显示出来。
这样,如果thread_dump()自身的实现有bug,搞不好就把这个目标Java进程给弄挂了。
又或者,如果目标进程没响应了(hung了),那它就接收不到那个threaddump命令,jstack就没办法正常执行了。

而后者,out-of-process方式则正好相反:调试功能在目标进程之外运行,通过进程间通信从目标进程获取数据。通常这种进程间通信依赖 于操作系统提供的调试API,移植起来会麻烦一些,而且数据的访问速度较慢;但好处是调试功能与调试目标之间有良好的隔离,即便调试功能自身有问题也不会 影响到目标进程。例如说用jstack -F去看线程栈信息,就算目标进程hung了也照样能看;或者是jstack -F自身有bug死循环了,只要把这个jstack -F的进程杀掉,目标进程就又能继续正常运行,不会受影响。

 

http://rednaxelafx.iteye.com/blog/1847971

http://hllvm.group.iteye.com/group/topic/34278

你可能感兴趣的:(sa-jdi.jar)