从java进程里dump出类的class文件的小工具--dumpclass
Serviceability Agent
想要查看一些被增強(qiáng)過的類的字節(jié)碼,或者一些AOP框架的生成類,就需要dump出運(yùn)行時(shí)的java進(jìn)程里的字節(jié)碼。
從運(yùn)行的java進(jìn)程里dump出運(yùn)行中的類的class文件的方法,所知道的有兩種
用agent attatch 到進(jìn)程,然后利用Instrumentation和ClassFileTransformer就可以獲取 到類的字節(jié)碼了。
使用sd-jdi.jar里的工具
sd-jdi.jar 里自帶的的sun.jvm.hotspot.tools.jcore.ClassDump就可以把類的class內(nèi)容dump到文件里。
ClassDump里可以設(shè)置兩個(gè)System properties:
- sun.jvm.hotspot.tools.jcore.filter Filter的類名
- sun.jvm.hotspot.tools.jcore.outputDir 輸出的目錄
sd-jdi.jar 里有一個(gè)sun.jvm.hotspot.tools.jcore.PackageNameFilter,可以指定Dump哪些包里的類。PackageNameFilter里有一個(gè)System property可以指定過濾哪些包:sun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList。
所以可以通過這樣子的命令來使用:
sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" -Dsun.jvm.hotspot.tools.jcore.filter=sun.jvm.hotspot.tools.jcore.PackageNameFilter -Dsun.jvm.hotspot.tools.jcore.PackageNameFilter.pkgList=com.test sun.jvm.hotspot.tools.jcore.ClassDump顯然,這個(gè)使用起來太麻煩了,而且不能應(yīng)對復(fù)雜的場景。
dumpclass
dumpclass這個(gè)小工具做了一些增強(qiáng),更加方便地使用。
- 支持? *的匹配
- 支持多個(gè)ClassLoader加載了同名類的情況。
比如多個(gè)classloader加載了多份的logger,如果不做區(qū)分,則dump出來時(shí)會(huì)被覆蓋掉,也分析不出問題。
dumpclass可以在maven倉庫里下載到:
http://search.maven.org/#search%7Cga%7C1%7Cdumpclass
dumpclass的用法很簡單,比如:
Usage:java -jar dumpclass.jar <pid> <pattern> [outputDir] <--classLoaderPrefix>Example:java -jar dumpclass.jar 4345 *StringUtilsjava -jar dumpclass.jar 4345 *StringUtils /tmpjava -jar dumpclass.jar 4345 *StringUtils /tmp --classLoaderPrefix對于多個(gè)ClassLoader的情況,可以使用--classLoaderPrefix,這樣子在輸出.class文件時(shí),會(huì)為每一個(gè)ClasssLoader創(chuàng)建一個(gè)目錄,比如:sun.jvm.hotspot.oops.Instance@955d26b8。并且會(huì)在目錄下放一個(gè)classLoader.text文件,里面是ClassLoader.toString()的內(nèi)容,方便查看具體ClassLoader是什么。
源碼和文檔:
https://github.com/hengyunabc/dumpclass
HSDB
在sa-jdi.jar里,還有一個(gè)圖形化的工具HSDB,也可以用來查看運(yùn)行的的字節(jié)碼。
sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB參考
http://rednaxelafx.iteye.com/blog/727938
https://docs.oracle.com/javase/7/docs/api/java/lang/instrument/ClassFileTransformer.html
http://openjdk.java.net/groups/hotspot/docs/Serviceability.html
總結(jié)
以上是生活随笔為你收集整理的从java进程里dump出类的class文件的小工具--dumpclass的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在开发环境中,自己搭建一个ssl环境(小
- 下一篇: SublimeText3 初探(工欲善其