`
RednaxelaFX
  • 浏览: 3015072 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

写了个打印出HotSpot VM里当前加载的所有类的路径和加载器摘要信息的工具

jvm 
阅读更多
写了个工具用来把一个运行中的HotSpot VM中所有加载了的类的:
类名, ProtectionDomain的CodeSource所记录的路径, 类加载器
这些信息打印出来。希望对大家有用。

代码:https://gist.github.com/1441625#file_dump_class_url.java
用法:https://gist.github.com/1441625#file_command_prompt
(注意:Windows上用这个需要JDK7或以上)

输出日志的例子:https://gist.github.com/1441625#file_log.txt

这工具的缺点是ProtectionDomain是里没记录某些类的路径,例如rt.jar里的在这个工具的输出就是null。Bootstrap class loader加载的类都会是这样。
另外,数组对应的Class与原始类型对应的Class都不包括在输出之内。
得感谢同事九任提醒可以通过ProtectionDomain拿到路径信息,虽然不保证全但也算够用。

这是个很简单的Serviceability Agent的应用。用它能很轻松的从VM里挖掘出许多有趣的信息出来。我常用的CLHSDB也是Serviceability Agent的一层皮,相当方便。
以前也在这个blog里发过几个例子:
2010-08-05: 借助HotSpot SA来一窥PermGen上的对象
2010-08-04: 借助HotSpot SA来反汇编
2010-08-03: 如何dump出一个Java进程里的类对应的Class文件?

跟同事的一段对话:
引用
同事A (15:26:42):
这个太有用了
同事B (15:30:01):
这个路径是指class文件在文件系统中的路径么?
我 (15:30:48):
这个路径是ProtectionDomain里的CodeSource记录的路径。不一定真的是文件系统上的路径,但一般是的
ProtectionDomain里CodeSource的路径是可以造出来的
我 (15:31:54):
但只有用比较特别的类加载器的时候才会用到这功能
同事B (15:32:51):
JVM记录了他加载的全部类的class文件位置么?
我 (15:33:05):
不一定。
简单来说,我们常用的场景的类的路径是有记录的,就是在上面说的那里
同事B (15:34:08):
这部分信息对排错太有意义了
我 (15:34:51):
如果有同名的类被加载了多次的话,这个工具的输出里能很快看出来

...

同事C (15:48:05):
恩 是的 被这种问题折磨过的人 都是深有体会的,前几天找个commonloging的问题 开发人员说daily跟线上用的版本是一样的 我也没仔细看 就直接debug 发现代码完全是走别的版本的 搞了半个小时才弄好这个问题
这个工具的话 一下子就可以解决这样的问题了


P.S. 有同学问为啥不用Attach API来做,于是就用Attach API又做了一个:https://gist.github.com/1442201
使用这个工具必须设置JAVA_HOME环境变量。它的输出是在目标Java进程的stdout上(就像对HotSpot发kill -3一样…)
奇怪的是在我们的线上环境用Attach API没能正常把agent接上去。我现在还不知道为什么。
分享到:
评论
6 楼 RednaxelaFX 2011-12-13  
panggezi 写道

R大,难倒agentmain会被虚拟机回调很多次吗?我想动态随时查询虚拟机里加载的类信息。

要看多少次就执行多少次attach嘛,每次attach都会让那个agent新初始化一次,于是agentmain就被调了。那个agent执行完agentmain就退出了,影响不大。
5 楼 panggezi 2011-12-13  
RednaxelaFX 写道
panggezi 写道
还是前一种好,后一种agentmain太弱了,对于容器之类很多随着运行runtime动态加载的应该就打印不出来了吧

不是。instrumentation API里的getAllLoadedClasses不是在类加载的时候才起作用的。这两种方法走到最底下其实做的事情一样,都是遍历当前HotSpot VM里的SystemDictionary。

R大,难倒agentmain会被虚拟机回调很多次吗?我想动态随时查询虚拟机里加载的类信息。
4 楼 RednaxelaFX 2011-12-12  
panggezi 写道
还是前一种好,后一种agentmain太弱了,对于容器之类很多随着运行runtime动态加载的应该就打印不出来了吧

不是。instrumentation API里的getAllLoadedClasses不是在类加载的时候才起作用的。这两种方法走到最底下其实做的事情一样,都是遍历当前HotSpot VM里的SystemDictionary。
3 楼 panggezi 2011-12-12  
还是前一种好,后一种agentmain太弱了,对于容器之类很多随着运行runtime动态加载的应该就打印不出来了吧
2 楼 RednaxelaFX 2011-12-11  
agapple 写道
不错,我有个想法是想运行时提取内存对象的数据用于一些deadlock分析,但attach上去生存的类classloader和目标对象不是同一个,这有什么好的idea吗?

你得说得更详细才行。这段描述我看不出来你的问题点是什么。
1 楼 agapple 2011-12-11  
不错,我有个想法是想运行时提取内存对象的数据用于一些deadlock分析,但attach上去生存的类classloader和目标对象不是同一个,这有什么好的idea吗?

相关推荐

    Troubleshooting Guide for Java SE 6 with HotSpot VM

    Troubleshooting Guide for Java SE 6 with HotSpot VM

    The Java HotSpot VM.pdf

    The Java HotSpot VM.pdf

    Java HotSpot VM Options

    jvm参数介绍,oracle HotSpot官方参数文档。

    Hotspot VM源码

    有将近1500个C/C++头引用和源代码文件,整个虚拟机的代码加起来差不多有25万行。这些源代码中含有大家所期望看到的类装载器的实现,以及字节码解释器,其他相关辅助的运行时子程序;还有两个runtime编译器...

    hotspot.tar.gz

    官方完整版JVM源码Hotspot VM,文件名hotspot.tar.gz。官方完整版JVM源码Hotspot VM,文件名hotspot.tar.gz。

    java-jdk-hotspot源码

    学习JDK 源码必备,提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。 但不一定所有人都知道的是,这个目前看起来“血统纯正”的虚拟机在最初...

    HotSpot实战高清版本

    本书深入浅出地讲解了 HotSpot 虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包 括 OpenJDK 与 HotSpot 项目、编译和调试 HotSpot 的方法、HotSpot 内核结构、Launcher、OOP-Klass 对象表 示系统...

    借HSDB来探索HotSpot VM的运行时数据.gist1

    It will be set after the class is loaded.VM Started: Set deferred breakpoint Tes

    HotSpot Runtime概述

    本节介绍与HotSpot ... VM类加载  字节码验证器和格式检查器  类数据共享  解释器  Java异常处理  同步  线程管理  C ++堆管理  Java本地接口(JNI)  VM致命错误处理  引用  进一步阅读

    JAVA虚拟机精讲

    Mark-Sweep)收集器和G1(Garbage-First)收集器)、类加载机制,以及HotSpot VM 基于栈的架构模型和执行引擎(解释器的工作流程、JIT 编译器的工作流程、分层编译策略、热点探测功能)等技术。

    hllvm.HotSpot VM Serial GC的一个问题1

    実装​》第4章4.4小节​. 每个版本的算法描述都稍微不同,我的伪代码也跟这两本书写的方式稍微不同,但背后要表达的核心思想是一样的就OK了.Tracing GC

    hotspot源码

    提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。

    JVM-类加载器与双亲委托

    虚拟机为HotSpot 1.类加载器 类加载器一般只有3种(除开自己定义的)分别为: 1.Bootstrap ClassLoader:根加载器 2.Extension ClassLoader:扩展加载器 ...代码:打印被跟加载器加载的类 public class Test01 { p

    Java虚拟机精讲.高翔龙.带书签完整版.pdf

    Mark-Sweep)收集器和G1(Garbage-First)收集器)、类加载机制,以及HotSpot VM 基于栈的架构模型和执行引擎(解释器的工作流程、JIT 编译器的工作流程、分层编译策略、热点探测功能)等技术。

    JAVA虚拟机精讲 pdf

    Mark-Sweep)收集器和G1(Garbage-First)收集器)、类加载机制,以及HotSpot VM 基于栈的架构模型和执行引擎(解释器的工作流程、JIT 编译器的工作流程、分层编译策略、热点探测功能)等技术。

    HotSpot实战

    《HotSpot实战》深入浅出地讲解了HotSpot虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包括OpenJDK与HotSpot项目、编译和调试HotSpot的方法、HotSpot内核结构、Launcher、OOP-Klass对象表示系统...

    java虚拟机精讲(电子工业出版社出版)

    本书以极其精练的语句诠释了 HotSpot VM的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析 HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器...

    jdk1.8 下载。 hotspot (包含源码)

    jdk1.8。hotspot java jdk java开发工具。

    借HSDB来探索HotSpot VM的运行时数据1

    DR版回答是:t1在存Java静态变量的地方, 概念上在JVM的方法区(method area)里t2在Java堆里, 作为Test的一个实例的字段存在t3在J

Global site tag (gtag.js) - Google Analytics