Java程式運行記憶體機制
- 2020 年 9 月 26 日
- 筆記
Java程式運行記憶體機制
棧記憶體包留調用方法、變數的區域,堆記憶體是new對象的區域,方法區為保存class文件的區域。
程式剛開始時,先載入類文件相應的數據到方法區,然後就從main()
方法開始執行。執行main()
方法,main()
方法入棧,執行phone one = new Phone()
,首先Phone one
聲明一個變數併入棧,然後new Phone()
在堆記憶體申請一塊空間,此時,申請的堆記憶體中保留著類文件中的那些變數;然後,申請區域中的方法則是一快存儲著方法地址的區域。然後堆中申請的區域的地址就被賦予給棧記憶體中聲明的變數進行初始化。然後就繼續執行one.brand = "蘋果";one.price = "8838.0";one.color = "黑色";
對聲明變數所指向的堆記憶體中的一些變數進行初始化(更新)。當調用one.call("喬布斯");
時,就會去尋找變數one中的方法區域去找相應的方法的地址然後就去方法區里去尋找相應的方法,然後就將one.call()
方法進行入棧,並執行。當執行完了後one.call()
就從棧空間中彈出棧。然後就繼續執行one.sendMessage()
,原理類似。當運行到main()
方法的結尾大括弧時,main函數就執行完成,main函數也彈出棧,程式就執行完成。
下圖為當聲明一個對象時的調用情況:
下圖為聲明2個對象時的調用情況:
當聲明第二個對象時,與前面說的一樣,會在先在棧記憶體中進行變數的入棧,然後new Phone()
會在堆記憶體內申請一塊記憶體。方法區還是跟原來一樣。
下圖是將一個對象的值賦給另一個對象的調用情況:
當將兩個對象的值賦值給其他對象時,會把該對象在棧記憶體中申請的記憶體的地址賦值給新對象,新對象也同時指向該區域,且一個對象對該區域的內容進行更改時,另一個對象也會察覺到。