這篇文章帶給大家的內容是介紹JVM的記憶體分配方式,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
本篇講解在java程式執行時,記憶體的分配是怎麼進行的?
java虛擬機器編譯時的記憶體儲存有三類:
1、靜態(方法區)儲存
2、堆疊式儲存
3、堆式儲存
靜態儲存是指在編譯的時候就得確定這個資料的儲存需求,然後給它一個固定的內存,所以說靜態存儲不允許有可變的數據結構出現,因為可變的數據不會確定存儲空間
棧式存儲相比於靜態存儲正好相反,在編譯時,棧式存儲指定的存儲資料是不確定的,只有真正運行到這個資料的時候才知道,那時候才能為它分配內存空間
堆式存儲相對於棧式存儲,棧式存儲在分配空間前必須指定資料要分配多少內存,而堆式儲存則完全無法確定資料結構所需的記憶體空間,例如可變數組,物件實例,所以堆是由大片的可利用區塊和空閒區塊組成
靜態儲存相對簡單,所以我們著重分析堆疊和堆疊的關係和差異
##區別 :在堆疊中的資料一旦超過它的作用域之後,就會被釋放,記憶體會被其他資料佔用
在堆中,分配的記憶體由java虛擬機自動垃圾回收器管理,這些可變數組、物件在沒有引用變數指向他們的時候,才會變成垃圾,但仍然佔著內存,之後再一個不確定的時間被垃圾回收器釋放掉
關係在堆中建立一個資料之後,可以在堆疊中定義一個變量,這個變數指向堆中的某個數據(指向資料的首地址),也就是說這個變數變成了堆中資料的引用變量,可以利用引用變數來存取堆中的數據,這就是java的指標。
壓棧),在這個方法的執行過程中,這個幀就會用來保存資料
方法的存在有堆疊決定,而由於先進後出的形式,方法之間巢狀的越深,stack的記憶體就越難釋放,所以遞歸這樣的方法本人不建議使用下面貼出壓棧和出棧的具體實作使用壓棧出棧來將字串倒序String value = "test 1234567890"; StringBuffer result = new StringBuffer(); Stack stack = new Stack(); for(char c : value.toCharArray()) { stack.push(c); } while (!stack.empty()) { result.append(stack.pop()); } value = result.toString();
Java教學》
#以上就是本篇文章的全部內容,希望能對大家的學習有所幫助。更多精彩內容大家可以追蹤php中文網相關教學欄位! ! !以上是JVM的記憶體分配方式介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!