`
xudelin
  • 浏览: 1522 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

通过HotSpot的Serviceability Agent 导出JVM Class文件

阅读更多

 

 

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文件

    首先,当我们谈论"jvm解析编译过的class文件"时,我们要知道,Java源代码(如TestClass.java)通过Java编译器(javac)被编译成字节码,即.class文件。这个字节码是一种平台无关的二进制格式,它包含了类定义、方法...

    JVM Hotspot实现源码

    首先,Hotspot JVM的核心设计理念是“热Spot”优化,即通过动态分析代码执行情况,识别出经常执行的“热点”代码,然后对其进行JIT(Just-In-Time)编译,生成高效的本地机器码。这种优化策略显著提升了Java应用的...

    hotspot(jvm 源码).zip

    java JWM 源码 ,版本jdk1.8 。java JVM 源码,版本 jdk 1.8。java JWM 源码 ,版本jdk1.8 。java JWM 源码 ,版本jdk1.8 。java JWM 源码 ,版本jdk1.8 。

    class文件编译器.zip

    这些源代码需要通过Java编译器(Javac)转换成字节码,即`.class`文件,以便于Java虚拟机(JVM)执行。`.class`文件包含了一组指令和数据结构,它们描述了程序在JVM上的行为。 2. **Javac编译器**: Javac是Java...

    Dissecting the Hotspot JVM-Martin Toshev.pdf

    本文档是关于 Java 虚拟机(JVM)的深入分析,作者 Martin Toshev 通过分享 JVM 的架构、实现机理和调试技术,帮助读者更好地理解 JVM,并为其提供了实践经验。 虚拟机基础 虚拟机是指一种可以执行某种语言的字节...

    Java打包成jar文件-以及将jar文件导出为exe文件方法汇总.docx

    2. exe 文件的 JVM 配置:可以选择 JVM 的版本,选择 Client hotspot VM 等信息。 3. exe 文件的搜索序列:可以选择搜索序列的方式,例如选择 Directory,浏览按钮,选择 JRE 所在的根目录,将 JRE 复制过来等。 ...

    ebs原版本jvm.dll文件

    根据提供的文件信息,我们可以了解到这是关于一个特定版本的 `jvm.dll` 文件的讨论,该文件位于 `C:\Program Files\Oracle\JInitiator 1.3.1.21\bin\hotspot` 目录下,并且被标记为“老版本”。接下来,我们将深入...

    Java Performance Companion(Addison,2016)

    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 PPT.pdf

    ### Sun Hotspot V1.6.0 JVM GC详解 #### 一、JVM结构与GC基础知识 ##### 1.1 JVM内存结构概述 Java虚拟机(JVM)内存主要分为以下几个部分: - **程序计数器(PC Register)**:记录当前线程所执行的字节码指令...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    1. JVM原理:JVM的工作原理涉及类加载器(ClassLoader)、类文件(ClassFile)、内存管理及垃圾收集机制。类加载器负责将.class文件加载到内存中,为程序的运行准备数据结构。内存管理涉及JVM内存区域,包括堆、栈、...

    OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)

    OpenJDK(HotSpot JVM、Javac)源代码学习研究(包括代码注释、文档、用于代码分析的测试用例)

    HotSpot GC官网文档截图 - 20200917

    【HotSpot GC官网文档截图 - 20200917】是一个珍贵的资源集合,包含了一系列关于Java HotSpot虚拟机(JVM)垃圾收集器(GC)的官方文档截图。这些截图详细介绍了GC的发展历程、不同版本的特性、选择GC的策略以及调优...

    JVM必知必会

    - **JVM**:负责执行Class文件,是Java虚拟机。 - **JRE**:Java运行环境,包括JVM和Java的核心类库。 - **JDK**:Java开发工具包,包含JRE和编译、调试等开发工具。 #### 3. JVM的基本结构 JVM由多个子系统和组件...

    jvm调优.zip & hotspot源码解读

    .class文件包含类的元数据和字节码指令,理解字节码的构成和执行逻辑对于理解JVM如何运行Java代码至关重要。字节码优化,如即时编译(JIT),能显著提高代码运行效率。 7. JVM调优实战: 调优不仅仅是理论学习,...

    Hotspot源码

    源码中包含了解释器的实现,如`InterpreterGenerator`和`interpreterRuntime.cpp`等文件,它们解析`.class`文件并执行字节码指令。 2. **即时编译器(JIT)**:Hotspot使用C1和C2两种编译器。C1是轻量级的编译器,...

    openjdk hotspot源码

    1. **Class File Parser**:这部分负责解析.class文件,将字节码转换为内部数据结构。它包含了对Java类和方法的定义,以及常量池等信息的处理。 2. **字节码解释器**:当JVM启动时,它首先通过解释器执行字节码。...

    JVM-HotSpot-原理

    • HotSpot • ClassFile • ClassLoader • 内存模型、锁、同步 • JVM内存管理和垃圾收集 Java发展历程 JVM列表 OpenJDK 编译执行过程 解析执行和JIT编译

    JVM基础.doc

    #### 一、JVM概述与HotSpot简介 Java虚拟机(JVM)是Java技术的核心组成部分之一,它为Java程序提供了运行时环境。本节将详细介绍JVM的基本概念及其核心技术——HotSpot。 **HotSpot VM** 是Oracle公司提供的一个高...

Global site tag (gtag.js) - Google Analytics