[讨论] sa-jdi.jar 和tools.jar 使用的一些问题

zhxing 2012-08-23
RednaxelaFX 写道
@zhxing

SA最有趣的一点就是它暴露出来的API完全是Java的,有极高的灵活性和可扩展性,所以用它来写工具非常方便。有时候我要对VM内的数据做分析的时候都会借助SA先用Java来写,如果实在有必要做在VM里再把它用C++重新写一次。

而attach API有两类用途,一类是加载Java agent,这个是可扩展的(自己写Java agent);另一类是工具通过私有API发送命令给JVM,执行特定的功能(如jstack、jmap),这种要扩展就必须改JVM自身,对上层程序员来说这扩展性几乎为0。除非打算自己修改与编译JVM,不然要捞JVM层面的数据还是用SA方便。


SA虽然方便,但是要了解只能靠源码了解其大概能实现什么功能,这个比较痛苦。。顺便问下R大,SA是否是JVMTI其中一部分的Java实现 ,还是??如果两者不一样的话,能否对比下。。:wink:
RednaxelaFX 2012-08-23
不,SA跟JVMTI的目的和用途都不一样。两者没有直接关系。

简单来说SA本来就是给JVM开发人员对VM自身做调试用的,并不是设计来给外面或者说Java应用层的开发人员用的。它的Java部分的源码跟HotSpot VM的C++源码有很强的联系,对VM开发人员来说这很直观所以也就不需要什么文档了——会对细节关心的人相应的也应该对VM自身很熟悉才对。

JVMTI是JVMDI、JVMPI等早期JDK提供的调试、剖析API的继承者。它本来就是设计来给外面的人使用的,而且是标准API,需要考虑到跨JVM的兼容性。
它现在主要用来支撑Java层的调试器(例如各主流Java IDE自带的那些)、profiler之类的工具。它的设计就是前面提到的in-process方式的。

要说相似性,Java agent跟JVMTI倒有一点点重叠的地方。JVMTI agent跟Java agent最大的区别是实现语言,前者用C/C++,后者用Java。它们重叠的地方主要是在类加载事件的监控、字节码改写之类的使用场景上。
Global site tag (gtag.js) - Google Analytics