JVM各區域的作用

首先關於JVM運行時我們常遇到的異常,1.OutOfMemoryError 2.stackOverflower

JAVA堆

java heap(堆)是java虛擬機中管理最大的一塊內存。heap中存的是程序在運行過程中創建的各種對象以及數組數據(因爲需要連續的內存並且空間佔用也比較大),如果堆沒有內存完成實例分配,而且堆也無法在擴展時,就會報OutOfMemoryError

GC: garbage collection垃圾回收,GC主要針對的heap空間進行回收。

方法區:方法區線程共享,通常用來裝載保存類的元數據信息,主要用來保存虛擬機加載的類數據,常量,靜態變量以及編譯之後的代碼等數據。方法區也稱永久代,但不代表這個區域和永久代名字一樣沒有任何垃圾回收,垃圾收集在這個區域特別的少,這個區域的內存回收目標是常量池的回收和類的卸載,通常這個區域表現良好,所以一般忽略這部分的討論。java虛擬機規範的規定,當方法區無法滿足內存分配需求時將報:OutOfMemory error

如下是JDK版本對於的堆和方法區存放數據的變化,本文檔主要基於1.6和1.7版本進行闡述。

程序計數器:是一塊空間佔用較少的內存,可以看作當前線程字節碼運行的行號指示器。任何時刻一個內核同一時刻只能執行一個線程,多線程的場景會有線程間的切換,線程切換後如何重新找到上次運行的位置就是通過程序計數器實現的。每個線程都有自己的程序計數器,程序計數器是線程間私有的不能共享。同時此區域是java 運行時數據區唯一一個不存在OutOfMemory error的區域。

Java虛擬機棧:也是線程私有的,java虛擬機棧描述的是一個方法在執行時的內存模型。每個方法被執行的時候都會同時建立一個棧幀(stack Frame)用於存儲局部變量表、操作棧、動態連接、方法出口等,每個方法被調用直至結束的過程就對於一個棧幀在虛擬機中入棧和出棧的過程。在此區域中對應兩種異常:(1)如果線程請求的棧深度大於虛擬機提供深度(遞歸調用)StackOverFlow error(2)如何虛擬機棧可以動態擴展,當擴展時無法申請到足夠的內存就會報OutofMemory error

本地方法棧:線程私有,本地方法棧和Java虛擬機棧功能類似,只是Java虛擬機棧爲虛擬機執行JAVA服務,而本地方法棧是爲本地Native 方法服務。也會拋出StackOverFlow error 和OutofMemory error異常。

異常總結:

1.棧溢出(StackOverFlow error)

2.堆溢出(OutofMemory error: JAVA heap space)

3.永久代(方法區)溢出(OutofMemory error: PermGen space)

4.OutofMemory error:unable create to native thread (本地方法棧)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章