http://blog.csdn.net/unei66/article/details/26477629

JVM 有 HotSpot引擎可以对热代码路径进行有效的 JIT优化,大幅度提升计算密集代码的性能。默认一个方法至少被调用10k次以上才可能被JIT优化。

查看JIT工作情况

Java代码

  1. public class VolatileBarrierExample {
  2. long a;
  3. volatile long v1=1;
  4. volatile long v2=1;
  5. void readAndWrite(){
  6. long j=v1;
  7. long i=v2;
  8. a=i+j;
  9. v1=i+1;
  10. long v=v1;
  11. v2=j*2;
  12. }
  13. public static void main(String[] args){
  14. final VolatileBarrierExample ex=new VolatileBarrierExample();
  15. for(int i=0;i<50000;i++)
  16. ex.readAndWrite();
  17. }
  18. }

运行命令:

  1. java -XX:+PrintCompilation VolatileBarrierExample

输出:

  1. VM option '+PrintCompilation'
  2. 242    1             VolatileBarrierExample::readAndWrite (40 bytes)
  3. 249    1 %           VolatileBarrierExample::main @ 10 (27 bytes)

用如下命令行可以更多地了解内联优化的实际情况以及优化发生的级别:

  1. 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下.

运行命令:

  1. java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly VolatileBarrierExample

产生的汇编代码

  1. VM option '+UnlockDiagnosticVMOptions'
  2. VM option '+PrintAssembly'
  3. OpenJDK 64-Bit Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
  4. Loaded disassembler from hsdis-amd64.so
  5. Decoding compiled method 0x00007fae110f5890:
  6. Code:
  7. [Disassembling for mach='i386:x86-64']
  8. [Entry Point]
  9. [Constants]
  10. # {method} 'readAndWrite' '()V' in 'VolatileBarrierExample'
  11. #           [sp+0x20]  (sp of caller)
  12. 0x00007fae110f59c0: mov    0x8(%rsi),%r10d
  13. 0x00007fae110f59c4: cmp    %r10,%rax
  14. 0x00007fae110f59c7: jne    0x00007fae110cd920  ;   {runtime_call}
  15. 0x00007fae110f59cd: nop
  16. 0x00007fae110f59ce: nop
  17. 0x00007fae110f59cf: nop
  18. [Verified Entry Point]
  19. 0x00007fae110f59d0: push   %rbp
  20. 0x00007fae110f59d1: sub    $0x10,%rsp
  21. 0x00007fae110f59d5: nop                       ;*synchronization entry
  22. ; - VolatileBarrierExample::readAndWrite@-1 (line 13)
  23. 0x00007fae110f59d6: mov    0x18(%rsi),%r10    ;*getfield v1
  24. ; - VolatileBarrierExample::readAndWrite@1 (line 13)
  25. 0x00007fae110f59da: mov    0x20(%rsi),%r11    ;*getfield v2
  26. ; - VolatileBarrierExample::readAndWrite@6 (line 14)
  27. 0x00007fae110f59de: mov    %r10,%r8
  28. 0x00007fae110f59e1: add    %r11,%r8
  29. 0x00007fae110f59e4: mov    %r8,0x10(%rsi)
  30. 0x00007fae110f59e8: shl    %r10
  31. 0x00007fae110f59eb: add    $0x1,%r11
  32. 0x00007fae110f59ef: mov    %r11,0x18(%rsi)
  33. 0x00007fae110f59f3: mov    %r10,0x20(%rsi)    ;*putfield v2
  34. ; - VolatileBarrierExample::readAndWrite@36 (line 18)
  35. 0x00007fae110f59f7: add    $0x10,%rsp
  36. 0x00007fae110f59fb: pop    %rbp
  37. 0x00007fae110f59fc: test   %eax,0xa6875fe(%rip)        # 0x00007fae1b77d000
  38. ;   {poll_return}
  39. ……….

如果只查看某个方法产生的汇编代码,可以使用命令:

  1. java -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*VolatileBarrierExample.readAndWrite VolatileBarrierExample

如果运行命令是出现此错误:

Could not load hsdis-amd64.so; library notloadable; PrintAssembly is disabled

可以设置

  1. 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生成的汇编代码的更多相关文章

  1. GCC生成的汇编代码

    假设我们写了一个C代码文件 code.c包含下面代码: int accum = 0; int sum(int x, int y){ int t = x + y; accum += t; return ...

  2. 利用hsdis和JITWatch查看分析HotSpot JIT compiler生成的汇编代码

    http://blog.csdn.net/hengyunabc/article/details/26898657

  3. 如何在windows平台下使用hsdis与jitwatch查看JIT后的汇编码

    1. 安装hsids 这一步比较麻烦,需要提前安装cygwin,以及下载openjdk的源码 具体步骤请参考下面的两篇文章 How to build hsdis-amd64.dll and hsdis ...

  4. 【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 ...

  5. 使用gcc不同选项来编译查看中间生成文件

    gcc编译C程序的总体流程如下图 用到的命令如下: .c---> .i gcc -E hello.c .c--->.s gcc -S hello.c .c--->.o gcc -c ...

  6. 分析一个C语言程序生成的汇编代码-《Linux内核分析》Week1作业

    署名信息 郭春阳 原创作品转载请注明出处 :<Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 C源码 这 ...

  7. 解析c语言背后的汇编代码

    源码 很简单的c语言代码,作用是交换两个数: #include <stdio.h> void swap(int * a, int * b) { *a = *a + *b - (*b = * ...

  8. Keil 中关于C语言编译生成汇编代码函数名规则

    在keil 中 C语言的函数有带参数和不带参数之分. 一般的资料里说fun(void)类型的函数不带参数,所以,keil编译器生成的汇编的调用地址(函数名) 为fun.这没有错.事实上,不管C语言的函 ...

  9. 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http: ...

随机推荐

  1. ES6学习笔记(一)——Promise

    Promise 是 ES6 提供的一种异步编程的解决方案: 将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数(解决异步函数回调地狱的问题).Promise 对象保存着异步操作的结果. 首先 ...

  2. 访问localhost与127.0.0.1的区别

    很多人会接触到这个ip地址127.0.0.1.也许你会问127.0.0.1是什么地址?其实127.0.0.1是一个回送地址,指本地机,一般用来测试使用.大家常用来ping 127.0.0.1来看本地i ...

  3. 【洛谷 P3469】[POI2008]BLO-Blockade(割点)

    题目链接 题意:一个无向联通图,求删去每个点及其所有边后有多少有序点对的连通性发生了变化. Tarjan求割点的例题.. 如果当前点不是割点,那么它对整个图的连通性不产生影响,只有自己与其他\(n-1 ...

  4. js三层引号嵌套

    ··· 参考:https://blog.csdn.net/feiyangbaxia/article/details/49681131 第一层用双引号,第二层转义双引号,第三层单引号

  5. 出现“error c4430缺少类型说明符-假定为int。注意C++不支持默认int

    出现这种错误的原因,是因为函数没有写返回值.是在VC6.0的工程转为高版本(VS2010)的时候经常出现的; #include <stdio.h> main() { printf(&quo ...

  6. Java反射——java.lang.Class 类简介

    Java的基本思想之一是万事万物即对象,类也是一种对象.但是类是什么对象呢?Java中的类是java.lang.Class的实例化对象,这被成为类类型. //java.lang.Class类中的的主要 ...

  7. [ Python - 9 ] 高阶函数map和reduce连用实例

    1. 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456: from functools import reduce def str2num( ...

  8. private,public,protected 的作用

    public  修饰的变量和函数可以在类的内部和外部都可以访问 protected   修饰的变量和函数只可以在类的内部访问,如果该类派生出子类,那么在子类中该变量和函数也可以使用 private   ...

  9. 使用Bind服务配置DNS服务器

    bind是什么 bind是DNS服务器软件 ,他的服务名称是named 功能区分: 正向解析:根据主机名查找对应的IP地址 反向解析:根据IP地址查找对应的主机名(域名) 工作形式上区分: 主服务器: ...

  10. cmake 同时编译多个cpp文件

    cmake_minimum_required(VERSION 2.8) project(coding) file(GLOB_RECURSE EXTRA_FILES */*) add_custom_ta ...