版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
classclassFoointa=staticintbar(intx)Foofoo=new寫留講 深入拆解Java虛擬 文章詳24|字段相關優(yōu)2018-09-142424|09′09′′|##{method}'bar''(I)I'in#parm0:=參數[sp+0x20](spof0x06a0://創(chuàng)建方0x06a7:QWORDPTR 無關指0x06ac:將參數x存入返回值eax0x06ae://彈出方0x06b2:無關指0x06b3:r10,QWORDPTR //安全點測寫留returnreturn(確切地說,是指所生成的IR圖與下述代碼所生成的IR圖類似。之后不再重復解釋。staticstaticintbar(int{inta=x;returna;}Sea-of-NodesIR下面我列舉了barC2(48)staticintstaticintbar(Fooo,intx)o.a=x;寫留在X86_64的機器碼中,每當使用call指令進入目標方法的方法體中時,我們需rsp0x06a00x06ae法返回時插入安全點測試指令,即圖中偏移量為0x06b3以及0x06ba的指令。其中真正的安全點測試是0x06ba指令。如果虛擬機需要所有線程都到達安全點,那么該test指令所的內存地址所在的頁將被標記為不可,而該指令也將觸發(fā)segfault,并借由segfault處理器進入安全點之中。通常,該指令會附帶;{poll_return}這樣子的注釋,這里寄存器中。有時候你會看到返回值被存入eax寄存器中,這其實是同一個寄存器,只不過rax表示64位寄存器,而eax表示32位寄存器。具體可以參考[x86callingconventions][1]。移量為0x06ac的mov指令,以及0x06ba的ret指令。前者將所傳入的int型參數x移至代表返回值的eax寄存器中,后者是退出當前方法并返回至調用者中。簡單的地步,但是逃逸分析畢竟不是Java虛擬機的銀色。在現實中,Java程序中的對象或許本身便是逃逸的,或許因為方法內聯(lián)不夠徹底而被即時編譯的是新建對象)。該方將所傳入的int型參數x的值至實例字段Foo.a中,然后再化為直接并返回傳入參數x的值。由于這段代碼較為簡單,因此它極大可能被編譯為寄存器之間的移動指令(即將輸入參數x的值移至寄存器eax中)。這與原本的內存指令相比,staticintstaticintbar(Fooo,intx)o.a=x;return}staticstaticintbar(Fooo,int{inty=o.a+x;returno.a+y;}寫留classclassFoobooleana;voidbar(){a=寫留staticstaticintbar(Fooo,int{intt=o.a;inty=t+x;returnt+y;}staticintstaticintbar(Fooo,intx)o.a=if(o.a>=0)returnx;return-}例如在上面這段代碼中,實例字段Foo.a會被賦值為1。接下來的if語句將判斷同一實例字段是否不小于0。經過字段優(yōu)化之后,>=節(jié)點的兩個輸入參數分別為常數1和0,因此可以直換為具體結果true。如此一來,else分支將變成不可達代碼,可以直接刪除,其優(yōu)化結staticintstaticintbar(Fooo,intx)o.a=1;return}一個以a為條件的while循環(huán)。voidwhatever()voidwhatever(){a=false;voidvoidbar()a=true;while(true){}生成的機器碼將陷入這一死循環(huán)0x066b:r11,QWORDPTR[r15+0x70]安全點測0x066f: DWORDPTR//安全點測0x0672://while實際上,即時編譯器將在volatile字段前后插入內存屏障節(jié)點。這些內存屏障節(jié)點會即就我們的例子而言,盡管在X86_64平臺上,volatile字段操作前后的內存屏障是no-op,在即時編譯過程中的屏障節(jié)點,還是會即時編譯器的字段優(yōu)化,強制在循環(huán)中使用內0x00e0:0x00e0:movzxr11d,BYTEPTR a0x00e5:r10,QWORDPTR[r15+0x70]安全點測0x00e9: DWORDPTR//安全點測0x00ec: //while0x00ef://while寫留}class}classFoointa=0;voidbar(){a=intt=a;a=t+優(yōu)化class{inta=0;voidbar()a=intt=1;a=t+寫留classclass{inta=0;voidbar()a=a=}}voidvoid{a=}寫寫留class{inta=voidbar()a=除了字段優(yōu)化之外,局部變量的死(deadstore)同樣也涉及了冗余。這是死代碼消除(deadcodeeliminiation)的一種。不過,由于Sea-of-NodesIR的特性,死的intintbar(intx,int{intt=x*y;t=x+y;returnt;}上面這段代碼涉及兩個局部變量操作。當即時編譯器將其轉換為Sea-of-NodesIR之后,沒有節(jié)點依賴于t的第一個值x*y。因此,該乘法運算將被消除,其結果如下所示:intintbar(intx,int{return}寫寫留ifift=x+y;returnt;booleanf是true,那么在程序執(zhí)行路Sea-of-NodesIRphiintintbar(booleanf,intx,int{intift=x+y;t=x*y;returnt;}在即時編譯過程中,我們經常因為方法內聯(lián)、常量以及基于profil
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《巨匠童心》課件
- 《童年回憶的》課件
- 《客戶梳理技巧》課件
- 2024年黑龍江農業(yè)工程職業(yè)學院單招職業(yè)技能測試題庫標準卷
- 四川省南充市2025屆高三上學期高考適應性考試(一診)英語試卷含答案
- 單位管理制度匯編大全職員管理
- 單位管理制度合并選集人力資源管理
- 單位管理制度分享合集【人力資源管理篇】
- 單位管理制度分享大合集【人力資源管理篇】
- 單位管理制度范例匯編職員管理篇十篇
- 監(jiān)理規(guī)劃、監(jiān)理細則審批表
- 交房安保方案
- 2023年下半年網絡規(guī)劃師考試真題及答案-上午卷
- 《財務共享實務》課程期末考試題庫及答案
- 氮氣緩沖罐安全操作規(guī)程
- 金工釩鈦科技有限公司-年處理600萬噸低品位釩鈦磁鐵礦選礦項目可行性研究報告
- 國能神皖安慶發(fā)電有限責任公司廠內108MW-108MWh儲能項目環(huán)境影響報告表
- 鐵路試驗檢測技術
- 2023-2024人教版小學2二年級數學下冊(全冊)教案【新教材】
- 小學奧數基礎教程(附練習題和答案)
- 九年級語文上學期教學工作總結
評論
0/150
提交評論