JVM-Java虛擬機自動內存管理機制

    JAVA與C/C++的區別之一,JAVA的內存交給JVM(Java Virtual Machine)來管理。也就是說,JAVA中我們只需要創建一個對象(new),此時該對象已在內存中申請了一塊空間,而這個空間何時被回收可分配,是由JVM來管理的,程序員不需要關心內存回收。

    那麼JAVA中把內存管理完全交給了虛擬機管理,我們還有必要學習JVM嗎?答案是要的。學習JVM有利於我們編程時內存優化和上線後出現內存溢出/內存泄漏問題排查。

JVM內存模型

    JAVA運行時數據區分爲五大區域:堆、方法區、本地方法棧、虛擬機棧、程序計數器。我們通常所說的java內存中,棧指虛擬機棧。

程序計數器

    程序計數器是線程私有的,在執行字節碼文件時,字節碼解釋器通過改變程序計數器的值來確定當前線程下一步要執行哪一行代碼,程序計數器是行號指示器,分支、循環、跳轉、異常處理、線程恢復等功能都要依賴程序計數器

 

JAVA虛擬機棧

     虛擬機棧描述java中方法的執行過程,方法的執行到結束對應着一個棧幀的入棧到出棧。 局部變量表中存儲了基本數據類型、引用類型(句柄)和returnAddress類型,在編譯期間完成分配(long、double佔用兩個局部變量空間(slot),其他基本類型佔一個slot),所以可以確定一個方法需要多大的slot;操作數棧中執行class文件在被解讀時要如何在棧中進行P,V操作,oracle官方中有操作棧中執行具體指令的說明文檔;動態鏈接將程序拆分成相對獨立的模塊,在程序執行的時候將各個模塊鏈接起來形成一個完整的程序。

    JVM規範中規定了此區域兩種異常情況:

       1.StackOverflowError:線程請求的棧深度大於虛擬機所允許的深度拋出;

       2.OutOfMemoryError:若虛擬機棧可擴展,擴展時無法申請到足夠的內存拋出。

 

本地方法棧

      本地方法棧也是用來描述方法的執行過程,區別是此區域僅用來描述native方法的執行過程。native方法在java代碼中都只有聲明,具體實現是與平臺有關的,jdk中的native方法多是用來加載文件和動態鏈接庫(IO、底層硬件設備等),因爲JAVA語言無法訪問操作系統底層信息。native修飾的方法可以被其他語言重寫實現。

   JVM規範中規定了此區域兩種異常情況:

       1.StackOverflowError:線程請求的棧深度大於虛擬機所允許的深度拋出;

       2.OutOfMemoryError:若虛擬機棧可擴展,擴展時無法申請到足夠的內存拋出。

 

JAVA堆

      Java堆的唯一目的就是用來存儲對象實例和數組,在虛擬機啓動時創建,被所有線程共享,是垃圾回收器的重點照顧對象。Java堆可以是物理上不連續,邏輯上連續的空間。

      對於使用分代收集算法的內存回收策略,此區域又可從邏輯上劃分爲新生代(Eden、From Survivor、To Survivor)、老年代。

      從內存分配的角度,線程共享的Java堆中可能被劃分出多個線程私有的分配緩衝區(TLAB)。

JVM規範中規定了此區域異常情況:當堆中沒有內存可被分配將拋出OutOfMemoryError異常。

 

方法區

      用於已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據,和java堆一樣,是線程共享的內存區域。在HotSpot®虛擬機中,HotSpot®虛擬機將分代收集擴展到了方法去,此區域被人們稱爲“永久代”。此區域和java堆一樣不需要連續的物理內存,可選擇固定的大小或擴展外,還可以不實現垃圾收集。垃圾收集在方法區比較少見,此區域的主要收集目標是常量池回收,和類型卸載。

   JVM規範中規定了此區域異常情況:當方法區無法滿足內存分配需求時,拋出OutOfMemoryError異常。   

 

直接內存

      直接內存(Direct Memory) 不是虛擬機運行時數據區的一部分,也不是java虛擬機規範中定義的內存區域,但是這部分內存也被頻繁使用,而且可能導致OOM。

      New IO引入了一種基於通道與緩衝區的I/O方式,可以使用native函數庫直接進行內存分配,然後通過一個存儲在java堆裏的DirectByteBuffer對象作爲這塊內存的引用進行操作。這樣可以避免在java堆和native堆中來回複製數據,可以顯著提升性能。本機直接內存會受到本機總內存的限制。所以在配置虛擬機內存的時候,要給native內存留足空間,因爲本機總內存是一定的。

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