Hotspot 的 Serviceability Agent 是个很强大的JVM 监控工具集合(这里简称SA),我们可以通过SA 提供的Java API(sa-jdi.jar)做很多有趣的事情。今天我们就通过SA的API导出 JVM实例中加载的Class文件。
1、编写测试类DumpClassTest
public class DumpClassTest{ public static void main(String[] args){ while(true){ try{ Thread.sleep(1000); }catche(Exception e){} } } }
2、编写DumpClass类,该类依赖
/home/tools/jdk1.6.0_43/lib/sa-jdi.jar
import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import sun.jvm.hotspot.bugspot.BugSpotAgent; import sun.jvm.hotspot.memory.SystemDictionary; import sun.jvm.hotspot.oops.InstanceKlass; import sun.jvm.hotspot.oops.Klass; import sun.jvm.hotspot.runtime.VM; import sun.jvm.hotspot.tools.jcore.ClassWriter; public class DumpVMClass { private static JarOutputStream jarStream; //导出目录地址 private static String outputDirectory = "/home/tools/jdk1.6.0_43/class/"; public static void main(String[] args){ BugSpotAgent agent = new BugSpotAgent(); try { int pid = Integer.parseInt(args[0]); agent.attach(pid); boolean isJavaMode = agent.isJavaMode(); if(isJavaMode){ SystemDictionary dict = VM.getVM().getSystemDictionary(); dict.classesDo(new SystemDictionary.ClassVisitor() { public void visit(Klass k) { if (!(k instanceof InstanceKlass)) return; try { DumpVMClass.dumpKlass((InstanceKlass)k); } catch (Exception e) { System.out.println(k.getName().asString()); e.printStackTrace(); } } }); } } catch (Exception e) { e.printStackTrace(); }finally{ agent.detach(); } } private static void dumpKlass(InstanceKlass kls) { String klassName = kls.getName().asString(); klassName = klassName.replace('/', File.separatorChar); try { OutputStream os = null; if (DumpVMClass.jarStream != null) { DumpVMClass.jarStream.putNextEntry(new JarEntry(klassName + ".class")); os = DumpVMClass.jarStream; } else { int index = klassName.lastIndexOf(File.separatorChar); File dir = null; if (index != -1) { String dirName = klassName.substring(0, index); dir = new File(DumpVMClass.outputDirectory, dirName); } else { dir = new File(DumpVMClass.outputDirectory); } dir.mkdirs(); File f = new File(dir, klassName.substring(index + 1) + ".class"); f.createNewFile(); os = new BufferedOutputStream(new FileOutputStream(f)); } try { ClassWriter cw = new ClassWriter(kls, os); cw.write(); } finally { if (os != DumpVMClass.jarStream) os.close(); } } catch (IOException exp) { exp.printStackTrace(); } } }
3、先运行DumpClassTest:
[root@oem-ci3bcm02f1h bin]# javac DumpClassTest.java [root@oem-ci3bcm02f1h bin]# java DumpClassTest & [5] 14060 [root@oem-ci3bcm02f1h bin]#4、获得PID 14060 后运行 DumpVMClass:
[root@oem-ci3bcm02f1h bin]# javac -cp .:../lib/sa-jdi.jar DumpVMClass.java [root@oem-ci3bcm02f1h bin]# java -cp .:../lib/sa-jdi.jar DumpVMClass 14060 [root@oem-ci3bcm02f1h bin]#
5、运行完就可以看到:
/home/tools/jdk1.6.0_43/class/ 目录下该JVM 14060进程 的class文件都被dump出来了。
注:
以上DumpVMClass 代码大部分来自于sa-jdi.jar 的
sun.jvm.hotspot.tools.jcore.ClassDump
相关推荐
首先,当我们谈论"jvm解析编译过的class文件"时,我们要知道,Java源代码(如TestClass.java)通过Java编译器(javac)被编译成字节码,即.class文件。这个字节码是一种平台无关的二进制格式,它包含了类定义、方法...
首先,Hotspot JVM的核心设计理念是“热Spot”优化,即通过动态分析代码执行情况,识别出经常执行的“热点”代码,然后对其进行JIT(Just-In-Time)编译,生成高效的本地机器码。这种优化策略显著提升了Java应用的...
java JWM 源码 ,版本jdk1.8 。java JVM 源码,版本 jdk 1.8。java JWM 源码 ,版本jdk1.8 。java JWM 源码 ,版本jdk1.8 。java JWM 源码 ,版本jdk1.8 。
这些源代码需要通过Java编译器(Javac)转换成字节码,即`.class`文件,以便于Java虚拟机(JVM)执行。`.class`文件包含了一组指令和数据结构,它们描述了程序在JVM上的行为。 2. **Javac编译器**: Javac是Java...
本文档是关于 Java 虚拟机(JVM)的深入分析,作者 Martin Toshev 通过分享 JVM 的架构、实现机理和调试技术,帮助读者更好地理解 JVM,并为其提供了实践经验。 虚拟机基础 虚拟机是指一种可以执行某种语言的字节...
2. exe 文件的 JVM 配置:可以选择 JVM 的版本,选择 Client hotspot VM 等信息。 3. exe 文件的搜索序列:可以选择搜索序列的方式,例如选择 Directory,浏览按钮,选择 JRE 所在的根目录,将 JRE 复制过来等。 ...
根据提供的文件信息,我们可以了解到这是关于一个特定版本的 `jvm.dll` 文件的讨论,该文件位于 `C:\Program Files\Oracle\JInitiator 1.3.1.21\bin\hotspot` 目录下,并且被标记为“老版本”。接下来,我们将深入...
Using HotSpot VM Serviceability Agent to analyze, triage, and resolve diverse HotSpot VM issues Troubleshooting out of memory errors, Java level deadlocks, and HotSpot VM crashes Extending the ...
### Sun Hotspot V1.6.0 JVM GC详解 #### 一、JVM结构与GC基础知识 ##### 1.1 JVM内存结构概述 Java虚拟机(JVM)内存主要分为以下几个部分: - **程序计数器(PC Register)**:记录当前线程所执行的字节码指令...
1. JVM原理:JVM的工作原理涉及类加载器(ClassLoader)、类文件(ClassFile)、内存管理及垃圾收集机制。类加载器负责将.class文件加载到内存中,为程序的运行准备数据结构。内存管理涉及JVM内存区域,包括堆、栈、...
OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)
【HotSpot GC官网文档截图 - 20200917】是一个珍贵的资源集合,包含了一系列关于Java HotSpot虚拟机(JVM)垃圾收集器(GC)的官方文档截图。这些截图详细介绍了GC的发展历程、不同版本的特性、选择GC的策略以及调优...
- **JVM**:负责执行Class文件,是Java虚拟机。 - **JRE**:Java运行环境,包括JVM和Java的核心类库。 - **JDK**:Java开发工具包,包含JRE和编译、调试等开发工具。 #### 3. JVM的基本结构 JVM由多个子系统和组件...
.class文件包含类的元数据和字节码指令,理解字节码的构成和执行逻辑对于理解JVM如何运行Java代码至关重要。字节码优化,如即时编译(JIT),能显著提高代码运行效率。 7. JVM调优实战: 调优不仅仅是理论学习,...
源码中包含了解释器的实现,如`InterpreterGenerator`和`interpreterRuntime.cpp`等文件,它们解析`.class`文件并执行字节码指令。 2. **即时编译器(JIT)**:Hotspot使用C1和C2两种编译器。C1是轻量级的编译器,...
1. **Class File Parser**:这部分负责解析.class文件,将字节码转换为内部数据结构。它包含了对Java类和方法的定义,以及常量池等信息的处理。 2. **字节码解释器**:当JVM启动时,它首先通过解释器执行字节码。...
• HotSpot • ClassFile • ClassLoader • 内存模型、锁、同步 • JVM内存管理和垃圾收集 Java发展历程 JVM列表 OpenJDK 编译执行过程 解析执行和JIT编译
#### 一、JVM概述与HotSpot简介 Java虚拟机(JVM)是Java技术的核心组成部分之一,它为Java程序提供了运行时环境。本节将详细介绍JVM的基本概念及其核心技术——HotSpot。 **HotSpot VM** 是Oracle公司提供的一个高...