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