Java物件導向記憶體分析詳解(例項、圖)通俗易懂

我的名字叫雪冬發表於2020-12-02

Java物件導向記憶體分析詳解(例項)通俗易懂

在開始之前先了解一下【JAVA虛擬機器執行時資料區域

1. 一個物件的記憶體圖解

在這裡插入圖片描述
①、在執行main方法之前,方法區最先有資料,按照上述程式碼執行順序,把類相關資訊載入到方法區中
②、main方法開始進棧(也叫做壓棧),執行 Phone one=new Phone(),把Phone one存到棧中(區域性變數/引用),把new Phone()存到堆中(new 的物件/陣列),那麼new出來的物件內容去哪裡找呢?
③、在我們建立物件的時候,我們從方法區找到成員變數、成員方法存放到堆中,然後我們在中把三個成員變數賦上初始值null、0.0、null,在中我們把成員方法賦個地址值為【0x333】(成員方法其實儲存的是一個地址值),這時堆當中的成員方法是一個地址值指向了方法區。我們把new Phone()也賦個地址值為【0x666】。
④、那麼我們在棧中就可以把【one】賦個地址值為【0x666】,我們在繼續看程式碼,執行三行列印輸出語句,根據地址【0x666】就可以找到這個物件,之前在堆中賦上了初始值null、0.0、null,所以列印出來的就是null、0.0、null,接下來在執行【one.brand=“蘋果”】、【one.price=8388.0】、【one.color=“黑色”】,根據地址值在堆中重新賦值為【蘋果】、【8388.0】、【黑色】改變了成員變數的值。
⑤、執行【one.call()】方法,首先通過one的地址值【0x666】在堆中找到成員方法,在通過成員方法的地址值【0x333】在方法區找到call()方法,call()方法要是執行,【call(String who)】方法就要進棧(也稱壓棧:先進後出),然後列印一句話,執行完後,call方法就會出棧,從記憶體中釋放。main方法還沒執行完,接下來在執行sendMessage()方法,同理執行完出棧,最後main方法執行完也要出棧,整個程式執行結束。

下面幾種情況,結合程式碼和圖可以自己試著分析。道理都大同小異。

2. 兩個物件使用同一個方法的記憶體圖解

在這裡插入圖片描述

3. 兩個引用指向同一個物件的記憶體圖解

在這裡插入圖片描述

4. 使用物件型別作為方法的引數記憶體圖解

在這裡插入圖片描述

5. 使用物件型別作為方法的返回值型別記憶體圖解

在這裡插入圖片描述

相關文章