Java物件導向記憶體分析詳解(例項、圖)通俗易懂
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. 使用物件型別作為方法的返回值型別記憶體圖解
相關文章
- 圖文詳解Java物件記憶體佈局Java物件記憶體
- Java物件導向詳解-上Java物件
- 詳解Python物件導向程式設計之類、例項、方法Python物件程式設計
- Java 物件記憶體分析Java物件記憶體
- JVM中java例項物件在記憶體中的佈局JVMJava物件記憶體
- 物件導向的例項應用:圖形計算器物件
- JavaScript物件導向詳解(原理)JavaScript物件
- Java記憶體模型最全詳解(5大模型圖解)Java記憶體大模型圖解
- 物件記憶體圖物件記憶體
- JAVA物件導向詳細總結Java物件
- JAVA服務例項記憶體高問題排查及解決Java記憶體
- 物件導向08:封裝詳解物件封裝
- JavaScript物件導向名詞詳解JavaScript物件
- (Java筆記)物件導向基礎Java筆記物件
- 物件的例項化、記憶體佈局以及訪問定位物件記憶體
- Java物件導向Java物件
- [Java物件導向]Java物件
- Java — 物件導向Java物件
- Java物件記憶體模型Java物件記憶體模型
- 選項卡(物件導向)物件
- JAVA物件導向基礎--物件導向介紹Java物件
- Java中的記憶體模型詳解Java記憶體模型
- Python - 物件導向程式設計 - 什麼是 Python 類、類物件、例項物件Python物件程式設計
- 【JVM之記憶體與垃圾回收篇】物件例項化記憶體佈局與訪問定位JVM記憶體物件
- 用例項帶你深入理解Java記憶體模型Java記憶體模型
- golang物件導向分析Golang物件
- php物件導向個人濃縮總結和例項PHP物件
- Java課堂筆記(二):物件導向Java筆記物件
- Java:Java的物件導向Java物件
- 原生js使用物件導向的方法開發選項卡例項教程JS物件
- 圖解python | 物件導向程式設計圖解Python物件程式設計
- Java物件記憶體佈局Java物件記憶體
- java物件導向(上)Java物件
- java物件導向(中)Java物件
- JAVA物件導向思想Java物件
- [Java物件導向]finalJava物件
- Java物件導向(一)Java物件
- java的物件導向Java物件