java記憶體結構(執行時資料區域)

來源:互聯網
上載者:User

標籤:sdn   padding   java方法   避免   地方法   width   啟動   java   Java記憶體結構   

java虛擬機器規範規定的java虛擬機器記憶體事實上就是java虛擬機器執行時資料區,其架構例如以下:

當中方法區和堆是由全部線程共用的資料區。

Java虛擬機器棧。本地方法棧和程式計數器是線程隔離的資料區。

(1).程式計數器:

是一塊較小的記憶體空間,其作用能夠看作是當前線程所啟動並執行位元組碼的行號指標,位元組碼解析器工作時通過改變程式計數器的值來選取下一條須要啟動並執行位元組碼指令。

程式的分支、迴圈、跳轉、異常處理以及線程恢複等基礎功能都是依賴程式計數器來完畢。

Java虛擬機器的多線程是通過線程輪流切換並分配處理器已耗用時間片來實現。在不論什麼一個時刻,一個處理器僅僅會運行一條線程指令。因此。為了確保線程切換之後能恢複到正確的運行位置,每條線程都須要一個獨立的程式計數器,因此程式計數器是線程私人的記憶體。

程式計數器是java虛擬機器中唯一一個沒有規定不論什麼記憶體溢出OutOfMemoryError的記憶體地區。

(2).java虛擬機器棧:

Java虛擬機器棧也是線程私人的。它的生命週期與線程同樣。

虛擬機器棧描寫敘述的是java方法啟動並執行記憶體模型:每一個方法被運行時都會同一時候建立一個棧幀用於存放局部變數表、運算元棧、動態串連和方法出口等資訊。每一個方法被調用直至運行完畢過程,就相應著一個棧幀在虛擬機器中從入棧到出棧的過程。

Java虛擬機器棧的局部變數表存放了編譯器可知的8種java基本類型資料、對象引用(注意不是對象執行個體本身)、方法返回地址returnAddress。

Java虛擬機器棧的局部變數資料表空間單位是槽(Slot),當中64位長度的double和long類型會佔用兩個slot。其餘的資料類型僅僅佔用一個slot。

局部變數表所需記憶體空間在編譯期間完畢分配,當進入一個方法時。該方法須要在幀中分配多大的局部變數空間是全然確定的,在方法執行期間不會改變局部變數表的大小。

Java虛擬機器棧有兩種異常狀況:假設線程請求的棧深度大於虛擬機器所同意的最大深度時,拋出StackOverflowError異常;假設虛擬機器棧能夠動態擴充,當擴充時無法申請到足夠記憶體時會拋出OutOfMemoryError異常。

(3).本地方法棧:

本地方法棧與java虛擬機器棧作用很類似。其差別是:java虛擬機器棧是為虛擬機器運行java方法服務。而本地方法棧是為虛擬機器調用的作業系統本地方法服務。

Java虛擬機器規範沒有對本地方法棧的實現和資料結構做強制規定。Sun HotSpot虛擬機器直接把java虛擬機器棧和本地方法棧合二為一。

與java虛擬機器棧類似,本地方法棧也會拋出StackOverflowError異常和OutOfMemoryError異常。

(4).堆:

堆是java虛擬機器所管理的記憶體地區中最大一塊,java堆是被全部線程所共用的一塊記憶體地區。在java虛擬機器啟動時建立。堆記憶體的唯一目的就是存放對象執行個體。差點兒全部的對象執行個體都是在堆分配記憶體。

Java堆是垃圾收集器管理的主要區域。從記憶體回收的角度看,因為如今的垃圾收集器基本都採用的是分代收集演算法。因此java堆還能夠初步細分為新生代和年老代。

Java虛擬機器規範規定,堆能夠處於物理上不連續的記憶體空間中,僅僅要邏輯上是連續的就可以。在實現上即能夠是固定大小的。也能夠是可動態擴充的。假設在堆中沒有記憶體完畢執行個體分配,而且堆大小也無法在擴充時,將會拋出OutOfMemoryError異常。

(5).方法區:

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

Sun HotSpot虛擬機器把方法區叫永久代(Permanent Generation),方法區中最重要的部分是執行時常量池。

Class檔案裡除了有類的版本號碼、欄位、方法、介面等描寫敘述資訊外,另一項資訊是常量池。用於存放編譯期產生的各種字面變數、符號引用、直接引用等,這些內容將在類載入後存放到方法區的執行時常量池中,另外在執行期間也能夠將新的常量存放到常量池中,如String的intern()方法。

方法區和執行時常量池在無法滿足記憶體配置時,也會拋出OutOfMemoryError異常。

(6).直接記憶體:

直接記憶體並非java虛擬機器執行時資料區的一部分,也不是java虛擬機器規範中定義的記憶體地區。可是在java開發中還是會使用到。

JDK1.4中新引入的NIO(new I/O),引入了一種基於通道(Channel)和緩衝區(Buffer)的I/O方式,能夠使用作業系統本地方法庫直接分配堆外記憶體,然後通過一個儲存在java堆裡面的DirectByteBuffer對象作為堆外直接記憶體的引用進行操作,避免了java堆記憶體和本地直接記憶體間的資料拷貝,能夠顯著提高效能。

儘管直接記憶體並不直接收到java虛擬機器記憶體影響。可是假設java虛擬機器各個記憶體地區總和大於實體記憶體限制,從而導致直接記憶體不足,動態擴充時也會拋出OutOfMemoryError異常。

java虛擬機器記憶體結構中的程式計數器、虛擬機器棧和本地方法棧這三個地區隨線程建立而生,隨線程銷毀而滅,因此這三個地區的記憶體配置和回收是確定的。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.