1. 程式人生 > >JVM技術週報第2期

JVM技術週報第2期

JVM技術週報第2期

JVM技術週報分享JVM技術交流群的討論內容,由群內成員整理歸納而成。如果你有興趣入群討論,請關注「Java技術精選」公眾號,通過右下角選單「入群交流」加我好友,獲取入群詳情。

1、如何閱讀原始碼?

在我的一個JVM技術交流群裡,有人丟擲了這樣一個問題:

經典框架的原始碼要怎麼讀容易些啊?比如spring,mybatis這種。

對於這個問題,群友進行了激烈的討論。

“原始碼”,作為菜鳥的我真是還沒有想法到這一步,現在總是感覺我做的東西離這個還遠呢,根本用不到,看這個幹嘛。有時間不如看看別的。原始碼看了又看不懂,就先不看了吧。然後就這樣“說服”自己,避開原始碼那一塊。但是實際上已經工作了兩年的我不應該再這樣繼續昏昏沉沉下去了,雖然我的理想很“豐滿”,但是現實……。最近又受了大佬的影響,我自己也想慢慢嘗試閱讀原始碼。那麼問題來了。如何下手?看哪些?怎麼看?

【原始碼如何“下手”】

我個人認為是先看同事寫的程式碼,因為一個專案總是一個團隊完成的,而不是一個人,有的時候在遇到bug的時候,那個bug不一定是你寫的,而是別人的程式碼造成了,那麼需要你修復的時候,那這個時候其實就是相當於在看原始碼,這一步就是開始在看“原始碼”了。因為所謂的框架的原始碼也都是別人寫的,只不過別人的確實比較“niubility”。

【該看那些原始碼呢】

在平時做專案時候,我相信String大家都見過的吧。那就先從String這個常見的原始碼開始。裡面一些常用的方法,如:equals、valueOf、length等

【該怎麼看呢】

知道了看哪些原始碼以後,那麼該怎麼看呢?實際上“看”真的不僅僅是看,你需要仔細看,反覆看,然後是自己嘗試寫,因為你看的再熟悉,哪怕你背出來了,你真不一定能寫出來。換句話說,你需要實踐,俗話說“實踐出真知嘛”,那“能動手就別走著瞧”了。

【大佬們的經驗】

剛開始看的時候不要每一行都看,因為你真的不是每一行都能看懂的,最好像String那樣,你能會用一些了,然後再分析,然後仿照一些方法自己嘗試寫來。有些晦澀難懂的就直接跳過,後期再看,不然硬生生強調“都看完了”那沒什麼用,那也就是在自欺欺人,這樣的毅力我們是不需要的。我們需要的是有效那部分。再強調下, 剛開始看千萬不要追求每一行都看懂。

我這裡將討論的結論總結一下:

  • 不要追求每行都看懂,而是先看懂框架。不要在不懂的地方過度消耗自己的精力。
  • 要善於學習別人的文章,善於請教別人。
  • 需要找到入口,之後再摸著繩子去閱讀。
  • 要有長期作戰的心理準備,而不是幾天、幾周的時間就搞定。
  • 要學會畫UML圖,通過UML圖梳理原始碼結構。

2、Native Memory、Heap Memory 和 Direct Memory之間的區別和聯絡

Native Memory 指的是本地記憶體,其實指的就是應用所執行機器的記憶體大小。更多時候指的是應用所執行作業系統分配給JVM的記憶體大小。Heap Memory 指的是JVM執行時資料區中定義的堆記憶體,其用來存放Java物件等共享的資料。Direct Memory 則是由於NIO產生而誕生的一塊資料區,其用來加速IO的讀取,其屬於 Native Memory 的一部分。

這三者的關係可以如下圖所示:

瞭解這三者之間的關係可以為我們解決一些線上問題打下基礎。例如線上發生了OOM異常,但此時的Java堆使用率還很低,那麼這時候你可能要懷疑是不是 Direct Memory 出了問題。

參考資料:

3、PC暫存器是什麼?它在記憶體結構中的位置是屬於哪裡?

PC暫存器也叫程式計數器(Program Counter Register)指的是儲存執行緒當前正在執行的方法。如果這個方法不是 native 方法,那麼 PC 暫存器就儲存 Java 虛擬機器正在執行的位元組碼指令地址。如果是 native 方法,那麼 PC 暫存器儲存的值是 undefined。任意時刻,一條 Java 虛擬機器執行緒只會執行一個方法的程式碼,而這個被執行緒執行的方法稱為該執行緒的當前方法,其地址被存在 PC 暫存器中。它是執行時資料區的,屬於執行緒的一部分,是執行緒私有的。

4、為什麼0xCAFEBABE是4個位元組?

為什麼 0xCAFEBABE 是 4 個位元組,而不是 8 個位元組。我估計很多人搞不清楚。

首先,0xCAFEBABE 是十六進位制,我想大家沒有異議。對於十六進位制的資料來說,它們每位能儲存16個值,這就相當於二進位制的 4 個位,也就是說 0x0F = 1111 = 15(十進位制)。也就是說一個十六進位制位相當於二進位制的4個位(bit)。

那麼兩個 16 進位制位,是不是相當於 8 個位,8 bit。

那麼 8 bit = 1 位元組。所以兩位 16 進位制 = 1 位元組。

所以 CAFE = 2位元組,BENE = 2 位元組。

一共 4 個位元組。