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

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

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

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

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

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

跟同事的一段对话:
[quote]同事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 发现代码完全是走别的版本的 搞了半个小时才弄好这个问题
这个工具的话 一下子就可以解决这样的问题了[/quote]

P.S. 有同学问为啥不用Attach API来做,于是就用Attach API又做了一个:[url]https://gist.github.com/1442201[/url]
使用这个工具必须设置JAVA_HOME环境变量。它的输出是在目标Java进程的stdout上(就像对HotSpot发kill -3一样…)
奇怪的是在我们的线上环境用Attach API没能正常把agent接上去。我现在还不知道为什么。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值