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.zip"是一个压缩文件,它包含了名为"sa-jdi.jar"的Java可执行 jar 文件。在Java开发中,JAR(Java Archive)文件是用于打包类库、资源文件以及应用程序的二进制文件。这种格式允许将多个文件组合...
sa-jdi-1.8.0.jar 位图BitMap
JD-GUI的全名是Java Decompiler Graphical User Interface,它由JDI (Java Decompiler Interface) 提供支持,是一款免费且开源的工具,适用于Windows、Linux和Mac OS等操作系统。它的主要功能是将.class文件转换为....
标题中的"src.zip(添加了其他rt.jar缺少的源码)"指的是这个压缩包包含了一些Java标准库rt.jar中没有公开的源代码。rt.jar是Java开发工具(JDK)中的一个核心组件,它包含了Java运行时环境的基础类库,如java.lang、...
- **Java打包工具(jar)**:打包类文件到.jar文件,方便分发和执行。 - **Java调试接口(JDI)和Java调试工具(jdb)**:用于调试Java应用程序。 - **Java应用启动器(java.exe/javaw.exe)**:启动Java应用程序...
│ bootstrap.jar │ catalina-tasks.xml │ catalina.bat │ catalina.sh │ commons-daemon-native.tar.gz │ commons-daemon.jar │ configtest.bat │ configtest.sh │ cpappend.bat │ daemon.sh │ digest....
这里提到的"apk反编译三件套"包括了apktool.bat、apktool_2.5.0.jar、dex2jar.zip和jd-gui-windows-1.6.6.zip,它们是反编译过程中的关键工具。 首先,让我们逐一了解这些工具的作用: 1. **apktool.bat**:这是...
jd-gui.exe的界面简洁直观,用户可以直接拖放.jar或.class文件到窗口上,程序会快速显示出反编译后的源代码。同时,它支持查看类、方法和变量的详细信息,包括常量池、字段、方法签名等,这对于分析和理解代码结构...
"jd-gui"是由JDI项目提供的一款开源Java反编译器,版本号为0.2.5,并且针对Windows平台进行了优化。JD-GUI允许用户直接打开并查看单个Java类文件的源代码,无需进行复杂的命令行操作。其特点是界面直观,能快速定位...
Sbt Tools Jar插件查找并将JDK tools.jar添加到sbt的非托管jar中,从而可以访问Java调试器接口(JDI)。安装sbt 1.0 将以下内容添加到project/plugins.sbt : addSbtPlugin( " org.scala-debugger " % " sbt-jdi-...
%JAVA_HOME%/lib/sa-jdi.jar sun.jvm.hotspot.HSDB`则启动HSDB。 HSDB是HotSpot虚拟机的调试桥,它可以连接到正在运行的JVM并提供对堆、栈、方法等的检查。在HSDB会话中,`universe`命令显示了堆的参数和状态。这里...
解决Failed to connect to remote VM com.sun.jdi.connect.spi.ClosedConnectionException错误,tomcat远程调试
5. **Java打包工具**(jar):用于创建和管理Java归档文件(.jar文件),这些文件可以包含多个类文件、相关的元数据和资源文件。 6. **Java调试接口**(JDI)和**Java调试器**(jdb):提供了一套API来调试Java应用...
它允许开发者直接查看.jar或.class文件中的源代码,即使原始的源代码不可用。由于无需安装,只需下载jd-gui.exe执行文件,使得JD-GUI成为快速查看Java字节码源码的便捷工具。 **工作原理** JD-GUI将Java字节码转换...
"jdk-6u23-fcs-src.zip"这个压缩包文件为我们提供了JDK6的完整源码,包括了通常在rt.jar中找不到的一些内部实现细节,这对于开发者深入学习Java,提升编程技能具有重要意义。 首先,我们要了解JDK6作为Java开发的一...
1. 实时查看源代码:JD-GUI可以直接打开.jar或.class文件,实时显示反编译后的源代码,无需进行任何配置或编译过程。 2. 显示类结构:提供清晰的类、方法和变量结构视图,便于理解程序逻辑。 3. 高亮显示:源代码...
最近升级到2020.1,出现cannot load a jdk class: com.sun.jdi.Field 可以直接修改 修改前 IDEA_JDK_64=C:\Program Files\Java\jdk1.8.0_144 修改后 IDEA_JDK_64=C:\Program Files\JetBrains\IntelliJ IDEA 2019.3...
JDK 11.0.9包含了一系列重要的组件,如Java运行时环境(JRE)、Java编译器(javac)、Java文档生成器(javadoc)、Java调试接口(JDI)等。这些工具为开发者提供了完整的开发和运行Java程序的能力。特别是对于MacOS...
HSDis的工作原理是利用JVM的调试接口(JDI),当JVM遇到一个新的方法要被解释或编译时,HSDis会拦截这个过程,然后将字节码转换为汇编代码。开发者可以通过JMX(Java Management Extensions)或者其他工具来触发这个...
对于`java.pro`的专业开发者,他们可能更关注高级特性,如并发编程(`java.util.concurrent`包)、JVM内存管理、Java虚拟机调试接口(JDI)、Java数据库连接(JDBC)以及Java应用程序接口(Swing或JavaFX)等。...