java自動記憶體管理機制

來源:互聯網
上載者:User

標籤:運行時資料區   常量   類資訊   沒有   地方   gis   永久代   異常   記憶體管理機制   

java程式員把記憶體管理的工作交給虛擬機器,一旦出現記憶體泄露或者溢出問題,如果不瞭解記憶體是怎樣工作的,那麼排查錯誤將是一件異常艱難的工作。

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

java運行時資料區域劃分:

線程隔離的

1.程式計數器(Program Counter Register)

當前線程執行代碼的行號指標,當線程切換並分配處理器執行時間,為了保證線程恢複到正確的執行位置,每個線程都有獨立的計數器

2.虛擬機器棧(VM Stack)

虛擬機器棧描述的是java方法執行的記憶體模型:每個方式執行的同時會建立一個棧幀(Stack Frame),用於儲存局部變數表、運算元棧、動態連結、方法出口等資訊。

局部變數表存放了編譯期可知的基礎資料型別 (Elementary Data Type),Reference類型,returnAddress類型。

其中long和double佔用兩個slot,其他佔用一個,局部變數表所需記憶體在編譯完全確定下來, 方法運行期間不會該表局部變數表大小。

這個地區規範了兩種異常狀況:

虛擬機器棧數超過虛擬機器允許數量,拋StackOverflowError

虛擬機器記憶體擴充無法申請足夠的記憶體空間,拋OutOfMemoryError

3.本地方法棧(Native Method Stack)

本地方法棧與虛擬機器棧作用類似,虛擬機器棧為虛擬機器執行java程式服務,本地方法棧為虛擬機器執行本地方法服務。

本地方法棧也會拋出StackOverflowError,OutOfMemoryError異常。

線程共用的

4.堆(Heap)

java 堆是所有線程共用的一塊記憶體地區,在Java虛擬機器規範中的描述是:The heap is the runtime data area from which memory for all class instances and arrays is allocated。

但是隨著jit編譯器發展和逃逸分析技術的成熟,棧內分配,標量替換使得對象不一定放在堆中存放

java堆是記憶體回收的主要管理地區,所以也成為GC堆,分代收集演算法把記憶體分為一下幾個地區:

新生代

Eden 、From Survivor、To Survivor

老年代

如果堆中沒有記憶體完成分配,並且堆也無法擴充時,拋OutOfMemoryError

5.方法區(Method Area)

Method Area是所有線程共用的地區,儲存類資訊,常量資訊,靜態變數資訊,編譯後代碼等。

SpotHot虛擬機器把GC分代收集擴充至方法區,方便像管理堆一樣來管理方法區,所以有些人更願意成它為“永久代”(Permanent Generation)

 

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.