JVM 《七 JVM 角度看對象》

  • 2020 年 2 月 25 日
  • 筆記

作為一個Java 程式設計師,天天與我們交互的除了邏輯就是對象了,我們可以自己new一個,也可以注入一個,得到對象的方法兒有很多。

這個對象有自己的屬性、方法。然後 我們就可以利用這些對象的行為來完成我們的邏輯了。這是對象站在我們的角度時的樣子。那在JVM或者電腦看起來是什麼樣子呢。

一、

首先,這是個對象。JVM也知道這是個對象,會給它一個標示。

也就是所謂的高大上的mark word&一些指針資訊,說白了也就是存儲一部分資訊的標示頭。

那這個mark中有什麼呢?

一部分是 對象運行時的一部分數據 比如:hashCode、GC分代年齡、鎖狀態標誌、執行緒持有的鎖、偏向執行緒ID、偏向時間戳。

然後是 一些類型指針。這個是用來指向它所屬的類的。

如果你現在正在學習Java 並發相關的內容,mark word 這部分的內容還是值得好好看一看的,出了Mark Word的結構,還有如何基於這個東西來實現那些個高級鎖。我們使用的的鎖,為什麼能鎖呢,對象鎖? 鎖?這類的問題這一塊都值得好好看看。

還有類對象挺特殊,Java 數組。

在普通的對象中,我們有一個記錄對象大小的欄位(顯然對象產生時大小已經就是確定的了)。但是數組對象不確定啊,我們需要一個欄位來標示該數組的元素個數~

二、

要說的對象的下一部分。

實例數據,就是這個對象中所包含的數據。沒別的 就這樣

三、

對齊填充

嗯,對齊填充

這樣一個對象的結構就很清晰了

然後前面提到了對象大小的問題,我們都很清楚對象包含的其他對象,其實僅僅是存儲了一個引用而已。那這個被包含的對象屬於我們這個對象的大小計算嗎?

這裡說明一下,對象的大小是分為兩種的: shallow size 、deep size

shallow size 是只算本對象內部內容的大小

deep size 是自身大小加上遞歸引用所有對象大小的總和

然後說起引用了,放兩張老圖,看看經典的樣子

image.png

image.png

這樣在JVM中的對象已經描述的差不多了。

其實呢這個是以 hotspot 為例來闡述的,其他的JVM會有一定的偏差不過明白運作原理、舉一反三才是最重要的吧。