Java虛擬機器系列---Java記憶體劃分

來源:互聯網
上載者:User

標籤:art   允許   行號   wol   共用   管理   最小堆   pdh   棧記憶體   

 Java和C++之間有一堵由記憶體管理和垃圾收集技術所圍成的“高牆”,牆外的人想進去,牆內的人卻想出來。  ------摘自《深入理解Java虛擬機器》

作為一個Java程式員,因為虛擬機器的好處,在開發過程中一般不用關心記憶體配置和記憶體回收方面的內容,這就讓我在跟C++的朋友聊天或溝通的時候,總覺得自己是個假的程式員,雖然我們不用自己動手去做這兩件事情,但還是很有必要去瞭解一下這方面的原理,這樣萬一真碰到記憶體溢出的問題,就不至於束手無策了。下面是通過看書總結的一些內容。

一、Java記憶體地區劃分

Java虛擬機器在執行Java程式的過程中,會把它所管理的記憶體地區劃分成不同的資料區域,沒有資料區域都有各自的功能、建立和銷毀時間,有些隨著虛擬機器的啟動而產生,有些隨著使用者線程的建立和結束而產生和銷毀,根據《Java虛擬機器規範》的規定,Java虛擬機器所管理的記憶體將會包含下面幾個部分:

從可知,Java虛擬機器記憶體主要由線程共用的堆記憶體、方法區和線程私人的虛擬機器棧、本地方法棧和程式計數器五個運行時資料區。

 二、各運行時資料區的功能介紹

1、程式計數器

1)程式計數器是當前線程所執行的位元組碼的行號指標,存放下一個要執行的位元組碼位置;

2)此記憶體地區是唯一一個在Java虛擬機器規範中沒有任何OutOfMemoryError異常的地區;

3)線程私人

2、Java虛擬機器棧

1)Java虛擬機器棧是方法執行的記憶體模型,通俗點說就是執行方法是進行記憶體管理的地區。

方法執行時,會建立一個棧幀,用於儲存方法中的局部變數、運算元、動態連結和方法出口等資訊,方法的調用執行過程就是一個棧幀在虛擬機器棧中進行入棧出棧的過程;

2)線程私人,隨著線程的開始而建立,線程的結束而銷毀;

3)通常所說的Java棧記憶體就是指Java虛擬機器棧中的局部變數表,它存放了編譯期可知的基本類型(boolean、byte、char、short、int、long、float、dounle)、對象引用和returnAddress類型。局部變數的大小在程式編譯期就已經完成,而且在方法執行期間不會被改變;

4)此地區可能發生的異常有:

StackOverflowError:當線程請求的棧深度超過Java虛擬機器所允許的棧深度時,會發生棧溢出異常;

OutOFMemoryError:當虛擬機器棧在動態擴充過程中沒有申請到足夠的記憶體時,會發生記憶體溢出異常;

3、本地方法棧

 1)同虛擬機器棧,本地方法棧也是Java方法執行的記憶體模型,區別在於虛擬機器棧是為Java程式在虛擬機器中執行服務的,而本地方法棧是為本地方法在Java虛擬機器中執行服務的。在虛擬機器規範中,對本地方法棧中的方法所使用的語言、使用方法和資料結構都沒有強制規定;

2)線程私人

3)可拋出兩種異常:

StackOverflowError:當線程請求的棧深度超過Java虛擬機器所允許的棧深度時,會發生棧溢出異常;

OutOFMemoryError:當虛擬機器棧在動態擴充過程中沒有申請到足夠的記憶體時,會發生記憶體溢出異常;

4、Java堆

1)堆記憶體是Java虛擬機器所管理的記憶體中最大的一塊;

2)線程共用,在虛擬機器啟動時建立;

3)用來存放對象執行個體和數組;

4)堆是垃圾收集器管理的主要區域,因此也稱GC堆;

5)堆記憶體可擴充,可通過參數--Xmx和--Xms來設定最大堆記憶體和最小堆記憶體來控制;

6)如果堆中沒有足夠的記憶體來分配執行個體,且堆無法擴充時就會拋出OutOfMemoryError異常

5、方法區

1)同堆記憶體一樣,方法區也是線程共用的記憶體地區;

2)用來儲存已經被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的代碼等資料;

3)根據Java虛擬機器規範,當方法區無法滿足記憶體配置需求時就會拋出OutOfMemoryError異常

6、直接記憶體

這部分記憶體既不是Java虛擬機器運行時資料區,也不是Java虛擬機器規範中定義的記憶體地區,但是這部分記憶體也會被頻繁使用,而且還有可能引起OutOfMemoryError異常。本機記憶體的分配不會受到Java虛擬機器記憶體配置的影響,但是當虛擬機器中各地區的記憶體之和大於本機記憶體的話,就會導致動態擴充時出現OutOfMemoryError異常

 以上就是Java虛擬機器中的記憶體模型及各記憶體在程式運行過程中所扮演的角色或所起的作用。下節將會總結各個記憶體地區出現記憶體溢出異常的原因和解決方案。

Java虛擬機器系列---Java記憶體劃分

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.