Java記憶體地區與記憶體溢出異常,java地區溢出

來源:互聯網
上載者:User

Java記憶體地區與記憶體溢出異常,java地區溢出

想要瞭解這方面的知識是因為一次OutOfMemoryError異常而起,當時的解決辦法是加上-Xmx1024m參數來擴大Java堆,還加了另一個參數-XX:-UseGCOverheadLimit。雖然問題解決了,但是還是覺得可以瞭解更多一點,所以買本書來看看。

Java記憶體地區:

java虛擬機器所管理的記憶體包括以下幾個運行時資料區域,:

既:程式計數器,Java虛擬機器棧,本地方法棧,Java堆和方法區。

程式計數器

是一塊較小的記憶體空間,他可以看 作是當前線程執行的位元組碼的行號指標。
由於java虛擬機器的多線程是通過線程輪流切換並分配處理器執行時間的方式來實現的,在任何一個確定的時間,一個處理器(對於多核處理器來說是一個核心)都只會執行一個線程中的指令。因此,為了線程切換後能恢複到正確的執行位置,每條線程都有一個獨立的程式計數器,各線程之間的計數器互不影響,隔離儲存區 (Isolated Storage),稱這樣的記憶體地區為“線程私人”的記憶體(虛擬機器棧,本地方法棧也是)。
如果線程執行的是一個Java方法,這個計數器記錄的是正在執行的虛擬機器位元組碼指令的地址;如果執行的native方法,這個計數器值則為空白(Undefined)。次記憶體地區是唯一一個在java虛擬機器規範中沒有規定任何OutofMemoryError情況的地區。

Java虛擬機器棧

也是線程私人的,它的生命週期與線程相同。虛擬機器棧描述的是java方法執行的記憶體模型:每個方法在執行的時候都會建立一個棧幀(Stack Frame)用於儲存局部變數表,運算元棧,動態連結,方法出口等資訊。每一個方法從調用直至只想完的過程都對應一個棧幀從入棧道出棧的過程。

本地方法棧

與虛擬機器棧發揮的作用是非常相似的,區別不過是java虛擬機器棧為細膩及執行java方法服務,而本地方法棧為虛擬機器使用到的native方法服務。

虛擬機器規範堆本地方法棧和java虛擬機器棧規定了兩種異常:如果線程請求的棧的深度大於虛擬機器所允許的深度,將會拋出StackOverflowError異常;如果虛擬機器棧可以動態擴充,如果擴充時無法申請到足夠的記憶體,會拋出OutOfMemoryError異常。

Java堆

對於大多數應用來說,java堆是虛擬機器所管理夫人記憶體中的最大的一塊。java堆是所有線程共用的一塊記憶體地區,在虛擬機器啟動時建立。次記憶體地區的唯一目的就是存放對象執行個體,幾乎所有的對象執行個體都在這裡分配記憶體。java堆屎記憶體回收行程管理的主要區域,因此很多時候也被稱為“GC”堆。從記憶體回收的角度來看,現在的回收器基本採用分代收集演算法 ,所以Java堆還可以劃分為:新生代和老年代,新生代又可以分為Eden空間和兩個Survicor空間,Eden空間存放建立的對象,經過記憶體回收存活下來的就會被放到Survivor空間,在Survivor空間和Eden空間存活對象超過一定比例有部分則會被放到老年代區,另外方法區是永久代。 根據java虛擬機器規範的規定,java堆可以處於物理上不連續的記憶體空間中,只要邏輯上連續即可。在實現時可以實現成固定大小的,也可以是可擴充的,當前主流的虛擬機器都是按照可擴充的來實現的(通過-Xmx和-Xms控制)。如果堆中沒有記憶體完成執行個體分配,也不能再擴充時,將會拋出OutOfMemoryError異常。

方法區

與java堆一樣,是各個線程共用的記憶體地區,它用於儲存已被虛擬機器載入的類資訊、常亮、靜態變數、即時編譯器編譯後的代碼等資料。Java虛擬機器吧方法區描述為堆得一個邏輯部分,但是它卻有一個別名叫Non-Heap(非堆),目的是與Java堆區分開來。

運行時常量池

(Rintime Constant Pool)是方法區的一部分。Class檔案中除了類的版本、欄位、方法、幾口等描述資訊外,還有一項資訊是常量池(Constant Pool Table),用於存放編譯期產生的各種字面量和符號引用,這部分內容將在類載入後進入方法區的運行時常量池中存放。運行時常量池的一個而重要特性是具備動態性,Java語言並不要求常量一定只在編譯期才產生,也就是並非預置入class檔案的常量池的內容才能進入方法去運行時常量池,運行期間也可能將新的常量放入池中,這種特性被用的比較多的便是String類的intern()方法.

記憶體溢出異常:Java堆溢出:

Java.lang.OutOfMemoryError:Java heap space。Java堆用於儲存物件執行個體,只要不斷地建立對象,並且保證GC Rootsd到對象之前有可達路徑來避免回收機制清楚這些對象,那麼在對象數量達到最大堆的容量限制後就會產生記憶體異常。可以通過-Xms最小值和-Xmx最大值來設定。

虛擬機器棧和本地方法棧溢出:

如果線程請求的棧深度大於虛擬機器允許的最大深度,將拋出StackOverflowError異常;如果虛擬機器在擴充棧時無法申請到足夠的記憶體,則拋出OutOfMemoryError異常。通過-Xss參數設定。

方法區和運行時常量池溢出:

Java.lang.OutOfMemoryError:PermGen space。
通過-XX:PermSize和-XX:MaxPermSize設定。

直接記憶體溢出:

因為系統記憶體不足造成。
通過-XX:MaxDirectMemorySize設定。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.