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;

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("[FORM]"+ 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
[FORM]/C:/Java/jdk1.7.0_51/jre/lib/ext/groovy-2.4.0.jar

参考资料

时间: 2024-12-29 05:27:09

HotSpot SA #4:输出类加载路径的相关文章

HotSpot SA #2:ClassDump

今天继续介绍HotSpot SA中的另一个好玩的工具,ClassDump.ClassDump可以在运行时dump类文件,我们可以用来dump一些动态生成或者运行时被修改了字节码的类.下面就借助ClassDump来看一看动态代理跟反射机制在运行时偷偷干的一些事情. 动态代理 看下面的栗子先, public interface Foo { void bar(); } public class FooImpl implements Foo { @Override public void bar() {

网上复制的旅行商问题,我想输出全部路径和费用,不知道怎么不行

问题描述 网上复制的旅行商问题,我想输出全部路径和费用,不知道怎么不行 #include #include using namespace std; int n,value; int cost[50][50]; int array[50]={0}; bool done[20]={0}; int start = 0; //从城市0开始 int traveller(int num, int cur) { if(num==1){ //递归调用的出口 for(int i=0;i cout } cout

HotSpot SA #3:FinalizerInfo

前面我们已经把玩过SA工具中的JStack和ClassDump,今天再来看个好玩的,FinalizerInfo. Object#finalize 看名字多半能猜到,FinalizerInfo是跟Object的finalize方法的执行有关的, Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

java中获取类加载路径和项目根路径的5种方式分析_java

复制代码 代码如下: package my;  import java.io.File; import java.io.IOException; import java.net.URL;  public class MyUrlDemo {           public static void main(String[] args) {         MyUrlDemo muDemo = new MyUrlDemo();         try {             muDemo.sh

迷宫路径输出问题-关于迷宫深度最短路径的问题

问题描述 关于迷宫深度最短路径的问题 #include #include #include #include #include #define N 100 using namespace std; struct node { double hgf; int xy; bool operator<(node other)const { return f } }; int map[N][N];//迷宫,1表示可以走,0表示不可以走 int rowcol;//矩阵的行和列 multiset open;/

《HotSpot实战》—— 1.2 动手编译虚拟机

1.2 动手编译虚拟机 源码面前,了无秘密.对于OpenJDK和HotSpot项目来说也是如此.因此,研究虚拟机实现机制的最佳途径就是阅读和调试源代码.我们希望能够动手编译一个完整的OpenJDK(含HotSpot)项目,或者仅编译HotSpot,这样就可以对虚拟机展开调试了. 虽然官方也支持在Windows操作系统下构建编译环境.但是经验表明,选择在Linux环境下搭建编译环境,可以避免不少弯路.理由有以下两点: Windows上为了得到完整的编译环境,需要借助Cygwin等虚拟环境,而在Li

HotSpot运行时概览#1

原文地址:http://openjdk.java.net/groups/hotspot/docs/RuntimeOverview.html 命令行参数处理 有许多的命令行选项和环境变量可以影响到HotSpot虚拟机的性能.其中有些选项直接由启动器处理(例如-server和-client),有些则是启动器先加工一下再交给虚拟机处理,但大部分选项还是由启动器直接交给虚拟机来处理. 主要有三类选项:标准选项,非标准选项,开发者选项.所有的JVM实现都要支持标准选项,即使不同的版本也要稳定支持(不管选项

如何过滤 adb logcat 输出

对原作者表示感谢,转自博客:http://www.otechu.me/zh/2011/12/filtering-adb-logcat-output/ 本文介绍如何在 shell 命令行中过滤 adb logcat 输出的几个小技巧. 开发当中经常看到别人的 log 如洪水般瞬间刷满了屏幕,对自己有用的信息都被淹没了,影响心情也影响效率.下面是几个我所知道的过滤方法. 1. 只显示需要的输出,白名单 最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配.简单的

PHOTOSHOP路径完全精通手册之一体验

请在学习本文后关注PHOTOSHOP路径完全精通手册系列(一 二 三 四 五)的其他文章 网上有很多HOTOSHOP的教程,但是对于路径却讲得很少,甚为不解,要知道路径也是PHOTOSHOP中一大利器.眼下你读到的这一系列文章将对PHOTOSHOP的这个重要概念--路径(PATH)做一个详细的讲解.内容包含各种路径工具的设置及使用方法.路径浮动面板中的菜单使用.右键菜单的使用等,还会结合实例说明路径在抠除图像背景,勾勒图像边缘,移动路径,与选择区域两者间的转换,以及在不同程序之间的资源共享,力图