Java HotSpot(TM) Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
CompilerOracle: dontinline *GenericClass.*
Could not load hsdis-i386.so; library not loadable; PrintAssembly is disabled
//尝试 输出动态的反汇编Code时 ,提示上面的错误。 没有hsdir这个可加载的反汇编的插件(an externally loadable disassembler plugin) 。
对该插件的阐述如下
对该插件的安装等详细参考 http://hg.openjdk.java.net/jdk7/hotspot/hotspot/file/9ad1548c6b63/src/share/tools/hsdis/README
安装过程中需要 binutils这个软件,这个软件版本至少是2.17 , 如果是编译为windows 平台下的dll 则版本至少是2.19。
我采用了当前最新版本。下载地址:http://directory.fsf.org/project/binutils/
下载完加压在 build/目录下,目录结构如下图:
开始编译 ,提供的编译很几种,查看Makefile文件或者README文件可知如下几种:
1, make all
2, make both
3, make demo
4, make clean
(不解释,阴文你懂的)
我选择make all 。
第一编译,得到一个 Warning : 提醒没有安装makeinfo。然后出现该死的Error
OK,安装makeinfo
// sudo apt-get install makeinfo
第二次编译 得到如下错误
没有找到 sysdep.h文件 。
// 查找
find -name sysdep.h
//output
./build/binutils/bfd/sysdep.h
./build/binutils/binutils/sysdep.h
./build/binutils/ld/sysdep.h
./build/binutils/opcodes/sysdep.h
而上面错误提示中编译时 头文件查找路径是
-I/bfd 这是根路径下啊!
查看Makefile 代码 121行。
CPPFLAGS += -I$(BINUTILSDIR)/include -I$(BINUTILS)/bfd -I$(TARGET_DIR)/bfd
以及关于 BINUTILS 值
ifeq ($(BINUTILS),) # Pop all the way out of the workspace to look for binutils. # ...You probably want to override this setting. BINUTILSDIR = $(shell cd build/binutils;pwd) else BINUTILSDIR = $(shell cd $(BINUTILS);pwd) endif
如果未指定 BINUTILS 的话,即 BINUTILS为空, BINUTILSDIR 为 build/binutils
而我编译的时候未指定 BINUTILS ,所以为空。 所以出现 “-I/bfd ”
纠正办法:
1,修改Makefile , (我使用)
-I$(BINUTILS)/bfd
改成
-I$(BINUTILSDIR)/bfd
2 ,编译的时候 加上 参数 BINUTILS = "build/binutils" (未测试)
第三次编译 ,通过。在 bulid/Linux-i586/目录下生成了 hsdis-i386.so
最后,安装.so文件了。方法有二 :
1, Copy hsdis-i386.so 到 java虚拟机安装目录的 jre/lib/i386/client/ 或者 (或和) jre/lib/i386/server/ 下 (跟libjvm.so同一目录)。
2, 将 hsdis-i386.so 添加到 LD_LIBRARY_PATH 里。
vim ~/.bashrc
// 最后一行添加
#HotSpot support hsdis export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:....(省略)hsdis/build/linux-i586
source ~/.bashrc
测试 :
java -Xcomp -XX:CompileCommand=dontinline,*GenericClass.* -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly Z > comp.log
生成 comp.log , 里面6万多行。如果要做比较,只能用diff工具。
补上参考:
http://hllvm.group.iteye.com/group/topic/21769 X86 asm代码 是怎么才能看到?
http://wikis.sun.com/display/HotSpotInternals/PrintAssembly PrintAssembly使用
http://directory.fsf.org/project/binutils/ Binutils工具
http://hllvm.group.iteye.com/group/topic/25910#183635 Java泛型的性能损耗
http://hg.openjdk.java.net/jdk7/hotspot/hotspot/file/tip/src/share/tools/hsdis/ hsdis 工具
http://kenai.com/projects/base-hsdis/lists/dev/archive/2009-11/message/0 类似编译问题