首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

施行篇:使用HSDIS插件分析JVM代码执行细节

2012-10-08 
执行篇:使用HSDIS插件分析JVM代码执行细节  声明:本文为笔者原创,但首发于InfoQ中文站,详见文末声明。  在《

执行篇:使用HSDIS插件分析JVM代码执行细节
  声明:本文为笔者原创,但首发于InfoQ中文站,详见文末声明。

  在《Java虚拟机规范》之中,详细描述了虚拟机指令集中每条指令的执行过程、执行前后对操作数栈、对局部变量表的影响等细节。这些细节描述与Sun的早期虚拟机(Sun Classic VM)高度吻合,但随着技术的发展,高性能虚拟机真正的细节实现方式已经渐渐与虚拟机规范所描述产生越来越大的差距,虚拟机规范中的描述逐渐成了虚拟机实现的“概念模型”——即实现只能保证规范描述等效。
  基于上面的原因,我们分析程序的执行语义问题(虚拟机做了什么)时,在字节码层面上分析完全可行,但分析程序的执行行为问题(虚拟机是怎样做的、性能如何)时,在字节码层面上分析就没有什么意义了,需要通过其他方式解决。

准备工作
  分析程序如何执行,通过软件调试工具(GDB、Windbg等)来断点调试是最常见的手段,但是这样的调试方式在JVM中会遇到很大困难,因为大量执行代码是通过JIT编译器动态生成到CodeBuffer中的,没有很简单的手段来处理这种混合模式的调试(不过相信虚拟机开发团队内部肯定是有内部工具的)。因此我们要通过一些曲线手段来解决问题,基于这种背景下,本文的主角——HSDIS插件就正式登场了。
  HSDIS是一份Sun官方推荐的HotSpot VM JIT编译代码的反汇编插件,它包含在HotSpot VM的源码之中,在Project Kenai(http://kenai.com/projects/base-hsdis )也可以下载到单独的源码。它的作用是让HotSpot的-XX:+PrintAssembly指令调用它来把动态生成的本地代码还原为汇编代码输出,同时还生成了大量非常有价值的注释,这样我们就可以通过输出的代码来分析问题。读者可以根据自己的操作系统和CPU类型从Kenai的网站上下载编译好的插件,直接放到JDK_HOME/jre/bin/client和JDK_HOME/jre/bin/server目录中即可。如果没有找到所需操作系统(譬如Windows的就没有)的成品,那就得自己拿源码编译一下,或者去HLLVM圈子(http://hllvm.group.iteye.com/ )中下载也可以。
  如果你使用的是Debug或者FastDebug版的HotSpot,那可以直接通过-XX:+PrintAssembly指令使用的插件;如果你使用的是Product版的HotSpot,那还要额外加入一个-XX:+UnlockDiagnosticVMOptions参数。笔者所使用的虚拟机是HotSpot B127 FastDebug(JDK 7 EA时的VM),默认为Client VM,后面的案例都基于这个运行环境之下:

  首先来看,代码最终执行时,for (int i = 0, n = list.size(); i < n; i++)的写法所生成的代码与for (int i = 0; i < list.size(); i++)有何差别。它们反汇编的结果如下(提取循环部分的代码):
  代码清单4:for (int i = 0, n = list.size(); i < n; i++)的循环体
  
@_@ 我又土鳖了。 8 楼 RednaxelaFX 2011-11-03   刚才有同事照这边的说明做发觉不行,请让我补充一些内容:

1、hsdis插件要放在哪里?
请参考之前在邮件列表的一段讨论,针对JDK7有些更新信息:http://mail.openjdk.java.net/pipermail/hotspot-dev/2011-July/004286.html

2、hsdis是不是只能配合OpenJDK使用?
当然不是。Oracle/Sun JDK 6与JDK 7都支持。请参考一老帖:http://hllvm.group.iteye.com/group/topic/21769 9 楼 Willam2004 2011-11-13   如果你使用的是Debug或者FastDebug版的HotSpot

==

不知道你这个FastDebug是从哪里下载的?有链接么? 10 楼 IcyFenix 2011-11-13   Willam2004 写道如果你使用的是Debug或者FastDebug版的HotSpot

==

不知道你这个FastDebug是从哪里下载的?有链接么?

http://jdk7.java.net/archive/7-b147.html
再新一点的jdk就没有fastdebug下了,得自己build。

热点排行