HotSpot SA #4:输出类加载路径
来源:互联网 发布:dncy女装淘宝上有卖吗 编辑:程序博客网 时间:2024/06/05 18:18
参考R大的文章,也写了一个SA的小工具,可以输出指定类(使用-Dme.kisimple.just4fun.ClassPathDump=类名
指定)是从什么地方加载进来的,
package me.kisimple.just4fun;import sun.jvm.hotspot.oops.*;import sun.jvm.hotspot.runtime.VM;import sun.jvm.hotspot.tools.Tool;public class ClassPathDump extends Tool { private String className; public ClassPathDump(String className) { super(); this.className = className; } public static void main(String[] args) { String className = System.getProperty("me.kisimple.just4fun.ClassPathDump"); if(className != null) { ClassPathDump dump = new ClassPathDump(className.replace(".", "/")); dump.start(args); dump.stop(); } } @Override public void run() { VM vm = VM.getVM(); final ObjectHeap objectHeap = vm.getObjectHeap(); objectHeap.iteratePerm(new HeapVisitor() { @Override public void prologue(long l) { } @Override public boolean doObj(Oop oop) { if(oop instanceof InstanceKlass) { InstanceKlass klass = (InstanceKlass)oop; if(klass.getName() != null && className.equals(klass.getName().asString())) { Oop protectionDomain = klass.getProtectionDomain(); if(protectionDomain == null) return true; Oop codesource = getOopFieldValue(protectionDomain, "codesource", "Ljava/security/CodeSource;"); if(codesource == null) return true; Oop location = getOopFieldValue(codesource, "location", "Ljava/net/URL;"); if(location == null) return true; Oop path = getOopFieldValue(location, "path", "Ljava/lang/String;"); if (path == null) return true; System.out.println("////////////////////////////////////////"); System.out.println("[LOADED]" + className); System.out.println("[FROM]"+ OopUtilities.stringOopToString(path)); return true; } } return false; } @Override public void epilogue() { } }); } private Oop getOopFieldValue(Oop oop, String name, String sig) { InstanceKlass klass = (InstanceKlass) oop.getKlass(); OopField field = (OopField) klass.findField(name, sig); return field.getValue(oop); }}
执行以下命令(sa-jdi.jar
需要放在classpath上),
> java -Dme.kisimple.just4fun.ClassPathDump=groovy.lang.GroovyClassLoader me.kisimple.just4fun.ClassPathDump 6376
6376
是目标进程pid,示例输出如下,
Attaching to process ID 6376, please wait...Debugger attached successfully.Server compiler detected.JVM version is 24.51-b03////////////////////////////////////////[LOADED]groovy/lang/GroovyClassLoader[FROM]/C:/Java/jdk1.7.0_51/jre/lib/ext/groovy-2.4.0.jar
参考资料
- http://rednaxelafx.iteye.com/blog/1295944
0 0
- HotSpot SA #4:输出类加载路径
- HotSpot SA #1:JStack
- HotSpot SA #2:ClassDump
- HotSpot SA #3:FinalizerInfo
- mac hotspot sa
- POJ 3683 Priest John's Busiest Day(2-sa路径输出,4级)
- 【理解HotSpot虚拟机】类的加载机制
- 借助HotSpot SA来一窥PermGen上的对象
- java 加载类路径
- HotSpot
- URLClassLoader加载类的路径
- Tomact中的类加载路径
- java获取类加载路径
- 获取类加载的路径
- 类路径读取(加载)配置文件
- URLClassLoader加载类的路径
- SA
- sa
- Eclipse进行C编程,TChar无法转换为wchar的问题
- 你所不知道的html[5]与html中的那些事(一)
- [LeetCode 55]Jump Game
- 九连环分析与实现
- hive 安装
- HotSpot SA #4:输出类加载路径
- 土壤质地标准转换程序Java MVC模式
- phpstorm rename重命名规则
- java 线程安全的理论讲解
- android ddms工具使用
- csu 1547: Rectangle (01背包)
- 11个优秀PHP开发框架-专门为开发人员准备
- hadoop MapReduce 三种连接
- centos 6.4用yum安装中文输入法