HotSpot SA #4:输出类加载路径

参考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;{private String className;public ClassPathDump(String className) {super();this.className = className;}(String[] args) {String className = System.getProperty(“me.kisimple.just4fun.ClassPathDump”);if(className != null) {ClassPathDump dump = new ClassPathDump(className.replace(“.”, “/”));dump.start(args);dump.stop();}}() {VM vm = VM.getVM();final ObjectHeap objectHeap = vm.getObjectHeap();objectHeap.iteratePerm(new HeapVisitor() {(long l) {}(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(“[FORM]”+ OopUtilities.stringOopToString(path));return true;}}return false;}() {}});}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 -Dmeme

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[FORM]/C:/Java/jdk1.jar参考资料

人生就像是一场旅行,遇到的既有感人的,

HotSpot SA #4:输出类加载路径

相关文章:

你感兴趣的文章:

标签云: