• 使用hsdis查看jit生成的汇编代码


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

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

    查看JIT工作情况

    Java代码

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

    运行命令:
    [plain] view plain copy
     
     print?
    1. java -XX:+PrintCompilation VolatileBarrierExample  

    输出:


    [plain] view plain copy
     
     print?
    1. VM option '+PrintCompilation'  
    2. 242    1             VolatileBarrierExample::readAndWrite (40 bytes)  
    3. 249    1 %           VolatileBarrierExample::main @ 10 (27 bytes)  

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

    [plain] view plain copy
     
     print?
    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下.

    运行命令:

    [plain] view plain copy
     
     print?
    1. java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly VolatileBarrierExample  

    产生的汇编代码

    [plain] view plain copy
     
     print?
    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. ……….  

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

    [plain] view plain copy
     
     print?
    1. java -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*VolatileBarrierExample.readAndWrite VolatileBarrierExample  

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

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

    可以设置

    [plain] view plain copy
     
     print?
    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

  • 相关阅读:
    EasyUI中datagrid的行编辑模式中,找到特定的Editor,并为其添加事件
    easyui datagrid plunges 扩展 插件
    jQuery EasyUI DataGrid Checkbox 数据设定与取值
    Easyui Tree方法扩展
    记账凭证
    部分扩展功能总结
    凭证
    voucer
    Box2D 一、学习资料(库、pdf)
    EUI EXML内部类Skin和ItemRenderer
  • 原文地址:https://www.cnblogs.com/zengkefu/p/6910355.html
Copyright © 2020-2023  润新知