生活随笔
收集整理的這篇文章主要介紹了
R大多年前的一篇老PPT,找不到原文了
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
為啥別讀HotSpot VM的源碼(2012-03-03)
1. Kris Mok, Software Engineer, Taobao@rednaxelafx莫樞 /“撒迦”2.?為啥別讀HotSpot VM的源碼 第0次JVM源碼閱讀活動 阿里巴巴集團-技術(shù)共享平臺- 核心系統(tǒng)研發(fā)-專用計算組 莫樞(撒迦) 2012-03-033.?關(guān)于我…? 2009年畢業(yè)自南京大學(xué)軟件學(xué)院? 同年10月加入淘寶? 目前在參與JVM相關(guān)研發(fā)? 編程語言的設(shè)計與實現(xiàn)愛好者? 希望與各位同好多交流!? – 博客: http://rednaxelafx.iteye.com/ – 新浪微博: http://weibo.com/rednaxelafx – 高級語言虛擬機群組: http://hllvm.group.iteye.com/ – JVM源碼閱讀活動微群: http://q.weibo.com/18237664.?分享目標(biāo)(I)? 讓VM相關(guān)基礎(chǔ)知識尚淺的人找到閱讀 HotSpot VM源碼之外的學(xué)習(xí)JVM的路徑? 讓并不真的對VM內(nèi)部實現(xiàn)細(xì)節(jié)感興趣的人 不必在源碼上耗費精力5.?分享目標(biāo)(II)? 為后續(xù)活動做準(zhǔn)備 – 確定活動周期、形式、目標(biāo)受眾 – 吸引同好報名分享閱讀VM源碼的經(jīng)驗6.?突擊提問? 已讀過或正在讀OpenJDK的源碼?? 已讀過或正在讀其它VM的源碼?? 有興趣自己動手實現(xiàn)VM?? 有編譯器/解釋器的實現(xiàn)經(jīng)驗?7.?突擊提問(II)? PermGen – a. 不知道是什么? – b. 在“堆內(nèi)”? – c. 在“堆外”? – d. 不關(guān)心?8.?為啥要讀HotSpot VM的源碼?? 生產(chǎn)環(huán)境使用Oracle/Sun JDK或OpenJDK – 讀源碼有助解決問題(真能么?)? 三大主流高性能JVM中唯一開源的 – 另外兩個的源碼也讀不到? 想修煉內(nèi)功 – “現(xiàn)實”驅(qū)動還是真感興趣?? 找點樂子? 其它9.?讀HotSpot VM源碼想了解什么?? JVM crash了!為什么?怎么辦?? JVM報OutOfMemoryError了 …? 想學(xué)習(xí)如何操縱字節(jié)碼? “這段代碼創(chuàng)建了多少個對象”?? “JVM會讓String共享char[]”?? 其它10.?理想與現(xiàn)實(I)例子:JVM的架構(gòu)與知識點11.?概念中JVM的結(jié)構(gòu) 類加載器Class文件 子系統(tǒng) 內(nèi)存空間 自動內(nèi)存 本地 管理 方法區(qū) Java堆 Java棧 方法棧地址 數(shù)據(jù) 和指令 指令計數(shù)器 本地方法 以及其它 執(zhí)行引擎 接口 本地方法庫 隱含寄存器12.?某個JVM實現(xiàn)的架構(gòu)13.?HotSpot Server Compiler的優(yōu)化14.?理想與現(xiàn)實(II)例子:iadd字節(jié)碼指令的實現(xiàn)15.?例:概念 3) add value1 + value2 1) pop 4) pushvalue2 2) pop value1 +value1 value2 JVM規(guī)范所規(guī)定的抽象行為16.?例:理想——簡單直觀case SVM_INSTRUCTION_IADD: { /* instruction body */ jint value1 = stack[stack_size - 2].jint; ② jint value2 = stack[--stack_size].jint;① stack[stack_size - 1].jint = value1 + value2; ④ ③ /* dispatch */ goto dispatch;} 取自SableVM的switch版解釋器 (sablevm/src/libsablevm/instructions_switch.c)17.?例:現(xiàn)實——簡單但不那么直觀 ① ② ④ ③ 取自早期版本Maxine VM的模板JIT編譯器18.?例:現(xiàn)實——有點繞彎void TemplateTable::iop2(Operation op) { transition(itos, itos); switch (op) { case add : __ pop_i(rdx); __ addl (rax, rdx);break; case sub : __ movl(rdx, rax); __ pop_i(rax); __ subl (rax, rdx);break; case mul : __ pop_i(rdx); __ imull(rax, rdx);break; case _and : __ pop_i(rdx); __ andl (rax, rdx);break; case _or : __ pop_i(rdx); __ orl (rax, rdx);break; case _xor : __ pop_i(rdx); __ xorl (rax, rdx);break; 取自HotSpot VM的模板解釋器,AMD64版 case shl : __ movl(rcx, rax); __ pop_i(rax); __ shll (rax);break; case shr : __ movl(rcx, rax); __ pop_i(rax); __ sarl (rax);break; case ushr : __ movl(rcx, rax); __ pop_i(rax); __ shrl (rax);19.?例:現(xiàn)實——很多細(xì)節(jié)void LIR_Assembler::arith_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dest, CodeEmitInfo* info, bool pop_fpu_stack) { if (left->is_single_cpu()) { Register lreg = left->as_register(); if (right->is_single_cpu()) { // cpu register - cpu register Register rreg = right->as_register(); switch (code) { case lir_add: __ addl (lreg, rreg); break; // ... 取自HotSpot VM的 Client編譯器,AMD64版 } } else if (right->is_stack()) { // cpu register - stack Address raddr = frame_map()-> address_for_slot(right->single_stack_ix()); switch (code) { case lir_add: __ addl(lreg, raddr); break; // ... } } else if (right->is_constant()) { // cpu register - constant jint c = right->as_constant_ptr()->as_jint(); switch (code) { case lir_add: __ incrementl(lreg, c); break; // ... }20.?learn JVM without reading HotSpot VM’s source code不讀HOTSPOT VM的源碼21.?為何不要讀HotSpot VM的源碼?? 基礎(chǔ)概念不扎實時 – 硬讀復(fù)雜實現(xiàn)的源碼對理解基礎(chǔ)概念幫助不大 – 繁瑣的實現(xiàn)細(xì)節(jié)反而會掩蓋掉一些抽像概念? 已有現(xiàn)成的閱讀資料時 – 讀資料比讀源碼更容易吸收自己需要的信息 ? 因人而異? 可參加“源碼閱讀活動” – 讓別人讀源碼,等分享…?22.?不明就里讀源碼的壞處?? 加深誤解 – 案例1:HotSpot VM的解釋器是這樣實現(xiàn)的! ? 主流平臺上的HotSpot VM使用“模板解釋器”,而非這里 說的“C++解釋器” – 案例2:HotSpot VM用內(nèi)部地址實現(xiàn)Java對象的 hashCode()! ? oopDesc才是HotSpot VM中表示Java對象的類型; ciObject不是? 浪費時間/精力 – 讀了但全然無法理解,還不如先不讀 – 有些細(xì)節(jié)知道了也沒用(視目的而異)23.?如何不讀HotSpot VM的源碼? 僅為了理解Java程序的行為? – 是否已了解Java語言層面的規(guī)定? ? 否 => 先讀Java語言規(guī)范 – 是否已了解JVM的抽像概念? ? 否 => 先讀JVM規(guī)范 – 已確定想關(guān)注的行為是特定于某個實現(xiàn)? ? 否 => 回到前面兩點 – 是否有關(guān)于該實現(xiàn)的行為的文字描述? ? 是 => 先讀文字描述 ? 否 => 那…真的要讀源碼么??24.?如何不讀HotSpot VM的源碼(續(xù))? 仍然想深入學(xué)習(xí)VM的內(nèi)部知識? – 閱讀相關(guān)背景知識的書、論文、博客等 ? 能夠(在讀源碼前)事先了解許多術(shù)語 ? 知道術(shù)語便于找到更多資料 – 閱讀更簡單一些的VM實現(xiàn)的源碼 ? 循序漸進(jìn) – 自己動手寫簡單的編譯器/VM ? 實踐是檢驗真理的唯一標(biāo)準(zhǔn) – 最后… ? 如果真的很有空才去讀HotSpot VM的源碼25.?如何不讀HotSpot VM的源碼(續(xù))? 工作就是鼓搗HotSpot VM的內(nèi)部? – 那真的得讀代碼,而且還得非常仔細(xì)地讀 – 但動態(tài)調(diào)試比靜態(tài)閱讀代碼更有助形象地理解 – 入手順序 ? 文檔 ? 讀代碼 ? 做實驗+調(diào)試26.?alternative JVMs其它JVM27.?KVM? 項目主頁: – http://java.sun.com/products/cldc/? 介紹: – http://java.sun.com/products/cldc/wp/ 簡單小巧的JVM28.?KVM (續(xù))? 好處 – 包含JVM的最核心組件 – 實現(xiàn)方式與JVM規(guī)范所描述的抽象的JVM相近? 壞處 – 是Java ME CLDC VM,而不是Java SE VM – 未實現(xiàn)反射、浮點數(shù)計算等功能29.?Maxine VM? 項目主頁: – http://labs.oracle.com/projects/maxine/? 介紹: – https://wikis.oracle.com/download/attachment s/4161575/The+Maxine+Virtual+Machine.pdf 純Java實現(xiàn)的JVM30.?Maxine VM(續(xù))? 可在IDE里開發(fā)和調(diào)試? 二進(jìn)制兼容性 – 可使用Oracle JDK/OpenJDK的類庫,兼容主 流Java應(yīng)用31.?Maxine VM(續(xù))? 與HotSpot VM的部分對應(yīng)關(guān)系 – 對HotSpot Client Compiler(C1)感興趣的, 可以讀Maxine VM里的C1X來幫助理解 ? 可通過C1Visualizer以圖形界面更好的理解該編譯器 的設(shè)計 – 對HotSpot Server Compiler(C2)里的中間表 現(xiàn)形式(Sea-of-nodes IR)感興趣的,可以讀 Maxine VM里的Graal來幫助理解 ? 可通過IdealGraphVisualizer以圖形界面理解該編譯 器的設(shè)計32.?演示:Maxine Inspector33.?演示:C1Visualizer34.?演示:IdealGraphVisualizer35.?VMKit / J3? 項目主頁: – http://vmkit.llvm.org/? LLVM + MMTk + GNU Classpath 現(xiàn)成組件搭積木實現(xiàn)的JVM36.?其它項目? 其它值得閱讀源碼的 ? 其它值得閱讀源碼的 JVM 非JVM項目 – Jikes RVM / MRP – ASM – JamVM – cacaovm ? 其它值得實驗的項目 – SableVM – BiteScript37.?recommended reading推薦閱讀38.?VM相關(guān)書堆…39.?我讀過的VM相關(guān)書? 請參考豆瓣頁面 http://book.douban.com/people/Rednaxela FX/all?tag=VM? 基礎(chǔ)知識主要靠這些書獲得,通過自己寫 代碼來理解? 但比較深入的知識通常是從論文而不是書 中獲得的? Anyway,規(guī)范一定要讀!40.?計算機系統(tǒng)概論? http://book.douban.com/subject/2185076/41.?深入理解計算機系統(tǒng)? http://book.douban.com/subject/5407246/42.?程序設(shè)計語言——實踐之路? http://book.douban.com/subject/2152385/43.?虛擬機——系統(tǒng)與進(jìn)程的通用平臺? http://book.douban.com/subject/1885761/44.?游戲腳本高級編程? http://book.douban.com/subject/1927405/45.?Inside the Java 2 Virtual Machine? http://book.douban.com/subject/1788390/46.?深入理解Java虛擬機? http://book.douban.com/subject/6522893/47.?深入嵌入式Java虛擬機? http://book.douban.com/subject/1103575/48.?Python源碼剖析? http://book.douban.com/subject/3117898/49.?Shared Source CLI Essentials? http://book.douban.com/subject/1484763/50.?編譯原理 技術(shù)與工具? http://book.douban.com/subject/2970069/51.?深度探索C++對象模型? http://book.douban.com/subject/1091086/52.?Oracle JRockit: The Definitive Guide? http://book.douban.com/subject/4873919/53.?Java Performance? http://book.douban.com/subject/5980062/54.?The Garbage Collection Handbook? http://book.douban.com/subject/6809987/55.?The School of Niklaus Wirth? http://book.douban.com/subject/3152171/56.?QUESTIONS?57.?Kris Mok, Software Engineer, Taobao@rednaxelafx莫樞 /“撒迦”
轉(zhuǎn)載于:https://my.oschina.net/runforfuture/blog/777631
總結(jié)
以上是生活随笔為你收集整理的R大多年前的一篇老PPT,找不到原文了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。