<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          深入 Java 虛擬機HotSpot 源碼的書籍,這本不錯

          共 2145字,需瀏覽 5分鐘

           ·

          2021-11-23 20:00

          我估計不少 Java 技術棧的同學有閱讀源代碼的習慣,特別是 JDK 自帶的那些源碼。在 IDE 里點擊跳轉就能看明白,在 JDK 內部各種數(shù)據(jù)結構是怎樣實現(xiàn)的,各種線程安全在 Java 層面是怎樣實現(xiàn)的, String、Integer 這些默認的基礎類型是怎樣設計的等等。


          之后不久,有些人不止步于此,會想著更深入去了解一些內容,看看這些 Java 應用在 JVM 里到底是怎么樣跑起來的,Java 的線程和操作線程又是怎么樣關聯(lián)起來的,實現(xiàn)上到底是 1:1 還是 M:N 呢?甚至 JVM 層面的一些原理,像 GC 的邏輯,Hotspot 的 Hot 是如何認定的,編譯器又是怎樣做的優(yōu)化......

          ?

          而與使用眾多的 HotSpot 同源的 OpenJDK ,應該是第一選擇。龐大的開源項目,你會選擇從哪入手呢?


          在很早之前的文章里,我表達過一些我閱讀開源項目的思路和方法


          讀源碼時,我們到底在讀什么?

          源碼面前,了無秘密


          對于 JVM 源碼,我之前一直都是靜態(tài)的看,理解一些實現(xiàn)思路,以及從JDK 自帶的一些工具的 Java 源碼中,了解一些可以借鑒的使用細節(jié)。這么多年使用 Java 開源項目,當然知道跑起來觀察,能 Debug 體驗更好,心里雖明白,不過一直畏難也懶的動手。今年秋天,在翻看華章的一本 JVM 書籍時,想著自己編譯一個JDK 試了一試。



          話說看過不少的 JVM 相關書籍,基本都會在第一章介紹從源碼構建自己的JDK。如果沒真下手的時候,光看看熱鬧,好像也是執(zhí)行幾條命令就成了。

          真動手的時候,電腦的操作系統(tǒng)、系統(tǒng)版本、硬件、甚至編譯工具等等的區(qū)別,都會導致編譯過程出現(xiàn)問題。


          不過除了書籍,網上的各類前人的經驗可供參考外,OpenJDK 源碼里也預想到了這個工作的不易。所以在源碼里帶了一個「幫手」。在doc/building.html ??文件內,有個 troubleshooting 小章節(jié),把可能遇到的情況列了出來。



          我在書籍和網上沒找到解決辦法的時候,就是靠著這個編譯成功的。


          編譯之后,就可以愉快的? Debug 了,特別是當你下載CLion。JetBrains 的全家桶系列操作體驗都一樣,就和 Java 開發(fā)的使用類似,能一頭扎進 JDK 的海洋里看個究竟了。




          比如我們對?線程創(chuàng)建感興趣,加個斷點,你會看到許多你之前在執(zhí)行 jstack 時才能見到的名字,都出現(xiàn)在這里,有沒有遇到熟人的感覺?哈哈



          實際我們自己在代碼里要創(chuàng)建一個線程,調用流程更復雜,你會看到InstanceKlass, JavaCalls 等等,這些又是做什么的呢?就像毛衣破了一個洞,本想拉個線頭,結果...



          在繁雜的代碼和功能里,要有頭緒的閱讀也不太容易,除非一開始目標明確,有的放矢。

          我之前閱讀的華章這本 JVM 書籍『深入解析 Java 虛擬機 HotSpot』,感覺不錯。




          從類的加載、解析與初始化,對象的創(chuàng)建、運行時等都做了源碼層面的介紹。在并發(fā)設施方面還對內存模型、鎖的優(yōu)化, 不同粒度的鎖都原理和源碼層級的介紹。


          此外,對于編譯方面,也重點介紹了 C1 和 C2 的編譯器,從編譯流程到代碼優(yōu)化的一些方式等。以及垃圾回收部分,從不同垃圾收集器的角度,結合一些源碼,對 GC 的工作與實現(xiàn)也做了說明。


          比如上面的截圖里,關于用戶線程的創(chuàng)建,我們看到調用棧中有對于 JavaCalls的使用。那什么是 JavaCalls。這是一種用于 HotSpot VM 用來調用 Java 方法的實現(xiàn)方式,就像 Java 通過 JNI 來請求虛擬機方法一樣。Java 線程會在入口后使用 JavaCalls 執(zhí)行 Java 方法的 Thread.run()。


          再說說并發(fā)設施相關的,我們常用的并發(fā)包,以及一些Java 工具類框架的實現(xiàn),都基本用到了Unsafe類。而且我們自己在執(zhí)行? jstack 看到的線程棧時,有時常會看到 Unsafe.park 之類的內容,這些在 JUC 的 LockSupport 中被使用并以此出現(xiàn)了AQS 等等,這背后的 Park 是什么,怎樣工作的?書里結合源碼,分析了 ParkEvent的實現(xiàn),Parker 等的實現(xiàn)。關鍵代碼版段中包含部分注釋,?對于源碼閱讀和學習的朋友來說,是個不錯的指引。


          當然,對于書籍來說,我個人認為對于JVM 的門外漢,能再補充一些內容,一些概念再展開講講就更贊了。




          感謝華章出版社友情贊助,本次送出本文提到的書籍本。

          截止時間 11.25 中午12:00。每天抽一本。

          送書方式:為防止刷贊等行為,本次改為群內紅包的方式,手氣最佳者得之。


          請?zhí)砑游⑿胚M群:



          相關閱讀

          你真的會高效的在GitHub搜索開源項目嗎?

          80%的程序員都不了解的調試技巧

          自制Spring大神 Josh Long 同款命令行工具,值得擁有

          怎樣閱讀源代碼?





          源碼|實戰(zhàn)|成長|職場


          這里是「Tomcat那些事兒

          請留下你的足跡

          我們一起「終身成長」




          瀏覽 77
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  牛牛精品一区二区AV | 久久亚洲大家都在搜 | 黑人操逼逼 | 国产中文 | 久操视频网站 |