首頁 > Java > java教程 > 主體

JVM的記憶體分配方式介紹

青灯夜游
發布: 2019-03-28 13:34:46
轉載
3581 人瀏覽過

這篇文章帶給大家的內容是介紹JVM的記憶體分配方式,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

前言

本篇講解在java程式執行時,記憶體的分配是怎麼進行的?

java虛擬機器編譯時的記憶體儲存有三類:

1、靜態(方法區)儲存

2、堆疊式儲存

3、堆式儲存

靜態儲存是指在編譯的時候就得確定這個資料的儲存需求,然後給它一個固定的內存,所以說靜態存儲不允許有可變的數據結構出現,因為可變的數據不會確定存儲空間

棧式存儲相比於靜態存儲正好相反,在編譯時,棧式存儲指定的存儲資料是不確定的,只有真正運行到這個資料的時候才知道,那時候才能為它分配內存空間

堆式存儲相對於棧式存儲,棧式存儲在分配空間前必須指定資料要分配多少內存,而堆式儲存則完全無法確定資料結構所需的記憶體空間,例如可變數組,物件實例,所以堆是由大片的可利用區塊和空閒區塊組成

堆疊和堆疊

靜態儲存相對簡單,所以我們著重分析堆疊和堆疊的關係和差異

##區別在堆疊中的資料一旦超過它的作用域之後,就會被釋放,記憶體會被其他資料佔用
在堆中,分配的記憶體由java虛擬機自動垃圾回收器管理,這些可變數組、物件在沒有引用變數指向他們的時候,才會變成垃圾,但仍然佔著內存,之後再一個不確定的時間被垃圾回收器釋放掉

在一個JVM實例中,堆區只有一個,而堆疊可以有多個

關係在堆中建立一個資料之後,可以在堆疊中定義一個變量,這個變數指向堆中的某個數據(指向資料的首地址),也就是說這個變數變成了堆中資料的引用變量,可以利用引用變數來存取堆中的數據,這就是java的指標。

並且每個java應有都會有一個JVM實例,每個實例對應一個堆,在這個應有運行期間,所有的類別實例和陣列都放在這個堆中,在建立一個物件的時候會從兩個地方分配內存,在堆中是這個物件的實際值,而在堆疊(堆疊,也叫stack)中,分配的是堆中這個物件的索引

堆疊(stack)

先看下這張圖(嗯   畫的很形象)

JVM的記憶體分配方式介紹

JVM是基於堆疊的,每新建一個執行緒會分配一個堆疊,它是以幀為單位,有先進後出的特性(看圖可懂)

當啟動一個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中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!