使用hsdis查看jit生成的汇编代码
JVM 有 HotSpot引擎可以对热代码路径进行有效的 JIT优化,大幅度提升计算密集代码的性能。默认一个方法至少被调用10k次以上才可能被JIT优化。
查看JIT工作情况
Java代码
- public class VolatileBarrierExample {
- long a;
- volatile long v1=1;
- volatile long v2=1;
- void readAndWrite(){
- long j=v1;
- long i=v2;
- a=i+j;
- v1=i+1;
- long v=v1;
- v2=j*2;
- }
- public static void main(String[] args){
- final VolatileBarrierExample ex=new VolatileBarrierExample();
- for(int i=0;i<50000;i++)
- ex.readAndWrite();
- }
- }
运行命令:
- java -XX:+PrintCompilation VolatileBarrierExample
输出:
- VM option '+PrintCompilation'
- 242 1 VolatileBarrierExample::readAndWrite (40 bytes)
- 249 1 % VolatileBarrierExample::main @ 10 (27 bytes)
用如下命令行可以更多地了解内联优化的实际情况以及优化发生的级别:
- java -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining -XX:+TieredCompilation VolatileBarrierExample
查看JIT生成的汇编代码
环境说明:
1. CPU:Intel i7
2. 操作系统:Ubuntu 12.04-amd64
3. JDK:openjdkversion "1.7.0-internal-fastdebug",我使用的是fastdebug版本,可以直接使用openjdk。
4. hsdis 下载地址:https://kenai.com/projects/base-hsdis/downloads,也可自行下载源代码编译,将hsdis-*.so放在目录$JAVA_HOME/jre/lib/amd64/server下.
运行命令:
- java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly VolatileBarrierExample
产生的汇编代码
- VM option '+UnlockDiagnosticVMOptions'
- VM option '+PrintAssembly'
- OpenJDK 64-Bit Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
- Loaded disassembler from hsdis-amd64.so
- Decoding compiled method 0x00007fae110f5890:
- Code:
- [Disassembling for mach='i386:x86-64']
- [Entry Point]
- [Constants]
- # {method} 'readAndWrite' '()V' in 'VolatileBarrierExample'
- # [sp+0x20] (sp of caller)
- 0x00007fae110f59c0: mov 0x8(%rsi),%r10d
- 0x00007fae110f59c4: cmp %r10,%rax
- 0x00007fae110f59c7: jne 0x00007fae110cd920 ; {runtime_call}
- 0x00007fae110f59cd: nop
- 0x00007fae110f59ce: nop
- 0x00007fae110f59cf: nop
- [Verified Entry Point]
- 0x00007fae110f59d0: push %rbp
- 0x00007fae110f59d1: sub $0x10,%rsp
- 0x00007fae110f59d5: nop ;*synchronization entry
- ; - VolatileBarrierExample::readAndWrite@-1 (line 13)
- 0x00007fae110f59d6: mov 0x18(%rsi),%r10 ;*getfield v1
- ; - VolatileBarrierExample::readAndWrite@1 (line 13)
- 0x00007fae110f59da: mov 0x20(%rsi),%r11 ;*getfield v2
- ; - VolatileBarrierExample::readAndWrite@6 (line 14)
- 0x00007fae110f59de: mov %r10,%r8
- 0x00007fae110f59e1: add %r11,%r8
- 0x00007fae110f59e4: mov %r8,0x10(%rsi)
- 0x00007fae110f59e8: shl %r10
- 0x00007fae110f59eb: add $0x1,%r11
- 0x00007fae110f59ef: mov %r11,0x18(%rsi)
- 0x00007fae110f59f3: mov %r10,0x20(%rsi) ;*putfield v2
- ; - VolatileBarrierExample::readAndWrite@36 (line 18)
- 0x00007fae110f59f7: add $0x10,%rsp
- 0x00007fae110f59fb: pop %rbp
- 0x00007fae110f59fc: test %eax,0xa6875fe(%rip) # 0x00007fae1b77d000
- ; {poll_return}
- ……….
如果只查看某个方法产生的汇编代码,可以使用命令:
- java -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*VolatileBarrierExample.readAndWrite VolatileBarrierExample
如果运行命令是出现此错误:
Could not load hsdis-amd64.so; library notloadable; PrintAssembly is disabled
可以设置
- export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server/
参考资料:
1. http://chaoslawful.info/archives/387
2. https://wikis.oracle.com/display/HotSpotInternals/PrintAssembly
使用hsdis查看jit生成的汇编代码的更多相关文章
- GCC生成的汇编代码
假设我们写了一个C代码文件 code.c包含下面代码: int accum = 0; int sum(int x, int y){ int t = x + y; accum += t; return ...
- 利用hsdis和JITWatch查看分析HotSpot JIT compiler生成的汇编代码
http://blog.csdn.net/hengyunabc/article/details/26898657
- 如何在windows平台下使用hsdis与jitwatch查看JIT后的汇编码
1. 安装hsids 这一步比较麻烦,需要提前安装cygwin,以及下载openjdk的源码 具体步骤请参考下面的两篇文章 How to build hsdis-amd64.dll and hsdis ...
- 【JVM】-NO.110.JVM.1 -【hsdis jitwatch 生成查看汇编代码】
Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...
- 使用gcc不同选项来编译查看中间生成文件
gcc编译C程序的总体流程如下图 用到的命令如下: .c---> .i gcc -E hello.c .c--->.s gcc -S hello.c .c--->.o gcc -c ...
- 分析一个C语言程序生成的汇编代码-《Linux内核分析》Week1作业
署名信息 郭春阳 原创作品转载请注明出处 :<Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 C源码 这 ...
- 解析c语言背后的汇编代码
源码 很简单的c语言代码,作用是交换两个数: #include <stdio.h> void swap(int * a, int * b) { *a = *a + *b - (*b = * ...
- Keil 中关于C语言编译生成汇编代码函数名规则
在keil 中 C语言的函数有带参数和不带参数之分. 一般的资料里说fun(void)类型的函数不带参数,所以,keil编译器生成的汇编的调用地址(函数名) 为fun.这没有错.事实上,不管C语言的函 ...
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处 <Linux内核分析>MOOC课程http: ...
随机推荐
- Junit使用的超简单介绍
Junit使用的超简单介绍 前言:我对Junit了解的并不多,只是今天突然听到有人提到了它,而且现在时间还早,所以我觉得我不妨更一篇关于Junit4的超级超级简单的用法,全当是为了省去看官网demo的 ...
- c语言几个字符串处理函数的简单实现
直接贴代码: char* strcpy(char *a,char*b){//把字符串b全部拷贝到a中 assert(a != nullptr&&b != nullptr); char ...
- Vijos 1232 核电站问题
核电站问题 描述 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 现在,请你计算:对于给定的N和M,求不发生爆炸的放置核物 ...
- swift出师作,史丹佛大学游戏制作案例,计算器,小游戏
这两个案例得好好弄清楚,感觉在任何方面既然能够作为公开课被提到这所名校的课程里面自然有不得不学习的理由,感觉应该去入手一下,毕竟这种课,价格不匪,难以接触,能看到就当再教育了.
- 下拉列表 JComboBox 的使用
下拉列表(JComboBox)通常显示一个可选条目,允许用户在一个下拉列表中选择不同条目,用户也可以在文本区内输入选择项. package first; import java.awt.FlowLay ...
- 微信小程序登录状态
我们知道,WEB服务器通过浏览器携带的cookie获取session来判断是否是同一用户(或浏览器):Restful服务通过客户端传过来唯一ID,来识别调用用户. >为什么需要维护登录态? 有自 ...
- spring自定义参数绑定(日期格式转换)
spring参数绑定时可能出现 BindException(参数绑定异常),类似下面的日期绑定异常(前台传过来是String类型,实际的pojo是Date类型) default message [Fa ...
- python2.7字典转换成json时中文字符串变成unicode的问题:
参考:http://blog.csdn.net/u014431852/article/details/53058951 编码问题: python2.7字典转换成json时中文字符串变成unicode的 ...
- js中如何对时间进行设置
js中如何对时间进行设置 Js获取当前日期时间及其它操作var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getF ...
- Spring Mvc中@ResponseBody中文乱码解决,以及修改返回的Content-Type
http://www.codeif.com/topic/784 spring 3 mvc 的 @ResponseBody返回数据用起来很方便,但是中文乱码,而且返回的Content-Type不带编码信 ...