使用 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::[email protected]1 (line 13)
0x00007fae110f59d6: mov 0x18(%rsi),%r10 ;*getfield v1
; - VolatileBarrierExample::[email protected]1 (line 13)
0x00007fae110f59da: mov 0x20(%rsi),%r11 ;*getfield v2
; - VolatileBarrierExample::[email protected]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::[email protected]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/
相關推薦
使用 hsdis 檢視 JIT 生成的彙編程式碼
背景 JVM 有 HotSpot引擎可以對熱程式碼路徑進行有效的 JIT優化,大幅度提升計算密集程式碼的效能。預設一個方法至少被呼叫10k次以上才可能被JIT優化。 檢視JIT工作情況 Java程式碼 public class Volatil
mac環境下 HSDIS JIT生成反彙編程式碼
1、下載反彙編外掛 2、指定外掛的位置 hsdis-amd64.dylib放在$JAVA_PATH/jre/lib/server/中,與libjvm.dylib同目錄 3、設定JAVA_HOME 因為本機安裝了zulu,預設的jvm為openJDK,貌似
SparkSQL檢視除錯生成程式碼
網站和一些書籍都有介紹SparkSQL(DataFrame)會根據相應的操作生成最終執行的語句。這裡從一個簡單的、低階的問題入手到最後通過檢視生成的程式碼查詢問題的根源,並簡單介紹怎麼來除錯SparkSQL。 問題來源: 1 2 3 4 5 6 7 8 9
[彙編程式設計]檢視彙編程式碼
#include <iostream> using namespace std; int main() { cout << "Hello World!" << en
用Visual Studio檢視彙編程式碼
今天在學習記憶體相關知識時,使用了C語言和彙編,掌握了在VS中檢視彙編程式碼的方法,記錄如下: 1.設定斷點,啟動Debug模式(VS必須處於除錯狀態才能看到彙編指令視窗); 2.當程式執行到斷點處停
vs下檢視彙編程式碼
最近學習彙編。。。所以在vs下編寫些程式檢視彙編程式碼來對比一下。。 原始碼 #include<stdio.h> int add(int, int); int main() {int c = add(1, 2);printf("c=%d", c);return
gcc編譯過程檢視彙編程式碼
GCC GCC引數 舉例 GCC gcc大家都很熟悉,是個編譯器,功能強大,全稱是:GUN GCC。 平時大家都簡單的稱為:GCC, 功能強大,能夠編譯很多的語言。包括:c, c++, java, ada等… GCC引數 gcc平時
vs2008中檢視彙編程式碼
(在VC6.0中的方法為:project settings: ->C++->category == Listing files -> listing file type == Assembly with source code) 2. 使用反彙編方式 在斷點除錯的時候, 點選"除錯" -
如何用VS2010檢視彙編程式碼
宣告:以下教程是從網上copy下來的,權當給自己留一份記錄,經測試,可用。 1.建立一個 win32的控制檯程式,例如testasm。 2.將控制檯程式中的 testasm.cpp 重新命名為 testasm.c, 這樣編譯器才會以c語言的方式進行編譯。這個時候執行會報錯,
gcc檢視彙編程式碼
1.gcc編譯C語言程式 #include <stdio.h> intmain() { printf(“helloworld\n”); return0; }把上面的程式存為hello.c,然後用gcchello.c -o hello,然後./hello,即可看到
VC6.0如何看它生成的彙編程式碼
開啟“Project → Project Settings”, 選擇 C/C++ 選項卡,在“Category”欄選擇“Listing Files” 然後在Listing file type欄選擇“A
用gdb 檢視,執行彙編程式碼
用gdb 檢視彙編程式碼, 採用disassemble 和 x 命令。 nexti, stepi 可以單步指令執行 如下例: ------------------------------------------------------------ 原始碼: --------
Linux複習總結---如何檢視彙編程式碼
我們知道在Windows上用VS我們要去檢視彙編程式碼,只需要打個斷點,進入除錯,然後在除錯視窗中選擇反彙編即可,那麼linux上我們該如何檢視彙編程式碼? 首先我們要知道在linux上面命令代表什麼: gcc -E a.c -o a.i //預編
沉澱再出發:如何在eclipse中檢視java的核心程式碼
沉澱再出發:如何在eclipse中檢視java的核心程式碼 一、前言 很多時候我們在eclipse中按F3鍵打算檢視某一個系統類的定義的時候,總是彈出找不到類這樣的介面,這裡我們把核心對應的程式碼加進去就可以了。 二、解決辦法 2.1、開啟配置 首
微機原理彙編程式碼
STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS DATA SEGMENT MES DB 'su tie s
Intellij IDEA中使用MyBatis-generator自動生成MyBatis程式碼(Oracle)
原文地址:http://blog.csdn.net/z69183787/article/details/46560071 Intellij IDEA 14 作為JavaIDE 神器,接觸後發現,非常好用,對它愛不釋手,打算離開eclipse和myeclipse,投入Intell
程式設計師用軟體生成前端程式碼,前端妹子看完直接傻眼!卻遭領導批評
作為程式設計師經常會有一些口頭禪,比如說“程式碼複用思想”,“寫高質量的程式碼”,“程式碼在精不在多”,“思路比努力更重要”,這些話中大多強調的是策略的重要性,在工作中,勤奮固然重要,如果能在勤奮的基礎上強調一下方法與策略,那便會使工作起到事半功倍的效果,最近有一個程式設計師網友異於其他程式設計師,
Intellij IDEA 14中使用MyBatis generator 自動生成MyBatis程式碼
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Masm 如何除錯彙編程式碼
大二下的時候學了彙編,當時用的是 Masm 軟體,但是一直沒有去折騰,今天折騰了下,發現原來除錯這麼有用!!!強烈建議掌握一下,比自己一行行檢查錯誤快多了。 題目 已知資料段有: FIRST DB 12H, 34H SECOND DB 56H, 78H
mybatis generator自動生成sqlmap程式碼的不完善之處以及解決方法
a) 建表時,欄位名稱建議用"_"分隔多個單詞,比如:AWB_NO、REC_ID...,這樣生成的entity,屬性名稱就會變成漂亮的駝峰命名,即:awbNo、recId b)oracle中,數值形的欄位,如果指定精度,比如Number(12,2),預設生成entity屬性是BigDecimal型 ,如果不