1. 程式人生 > >Java程式執行記憶體機制

Java程式執行記憶體機制

# 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函式也彈出棧,程式就執行完成。 下圖為當宣告一個物件時的呼叫情況: ![](https://img2020.cnblogs.com/blog/2061063/202009/2061063-20200926151628800-1660172338.png) 下圖為宣告2個物件時的呼叫情況: ![](https://img2020.cnblogs.com/blog/2061063/202009/2061063-20200926151638667-355133881.png) 當宣告第二個物件時,與前面說的一樣,會在先在棧記憶體中進行變數的入棧,然後`new Phone()`會在堆記憶體內申請一塊記憶體。方法區還是跟原來一樣。 下圖是將一個物件的值賦給另一個物件的呼叫情況: ![](https://img2020.cnblogs.com/blog/2061063/202009/2061063-20200926151651291-1404487249.png) 當將兩個物件的值賦值給其他物件時,會把該物件在棧記憶體中申請的記憶體的地址賦值給新物件,新物件也同時指向該區域,且一個物件對該區域的內容進行更改時,另一個物件也會察