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()
會在堆記憶體內申請一塊記憶體。方法區還是跟原來一樣。
下圖是將一個物件的值賦給另一個物件的呼叫情況:
當將兩個物件的值賦值給其他物件時,會把該物件在棧記憶體中申請的記憶體的地址賦值給新物件,新物件也同時指向該區域,且一個物件對該區域的內容進行更改時,另一個物件也會察覺到。