使用jconsole監控JVM內存

首先聲明:此篇博文分析的是JDK1.8。java

JVM內存區域整體分兩類:heap區和非heap區。Jconsole中對內存劃分爲一樣的結構,以下:緩存

  

heap區又分爲: 
  - Eden Space(伊甸園)
  - Survivor Space(倖存者區) ,Survivor Space分爲兩個空間大小同樣的區域,分別是To Survivor和From Survivor,而且始終保持一個Survivor是空的
  - Old Gen(老年代)ruby

Eden Space:字面意思是伊甸園,對象被建立的時候首先放到Eden Space,進行垃圾回收後,不能被回收的對象被放入到空的Survivor區域。併發

Survivor Space:倖存者區,用於保存在eden space內存區域中通過垃圾回收後沒有被回收的對象。Survivor有兩個,分別爲To Survivor、 From Survivor,這個兩個區域的空間大小是同樣的。執行垃圾回收的時候Eden區域不能被回收的對象被放入到空的survivor(也就是To Survivor,同時Eden區域的內存會在垃圾回收的過程當中所有釋放),另外一個survivor(即From Survivor)裏不能被回收的對象也會被放入這個survivor(即To Survivor),而後To Survivor 和 From Survivor的標記會互換,始終保證一個survivor是空的。spa

Eden Space和Survivor Space都屬於新生代,新生代中執行的垃圾回收被稱之爲Minor GC(由於是對新生代進行垃圾回收,因此又被稱爲Young GC),每一次Young GC後留下來的對象age(年齡)加1,這個age就是用來判斷對象是否進入老年的標誌。code

Old Gen:老年代,用於存放新生代中通過屢次垃圾回收仍然存活的對象,也有多是新生代分配不了內存的大對象會直接進入老年代。通過屢次垃圾回收都沒有被回收的對象,這些對象的age已經足夠old了,就會放入到老年代。server

當老年代被放滿以後,虛擬機會進行垃圾回收,稱之爲Major GC。因爲Major GC除併發GC外均需對整個堆進行掃描和回收,所以又稱爲Full GC。對象

heap區即堆內存,整個堆大小=年輕代大小 + 老年代大小。堆內存默認爲物理內存的1/64(<1GB);默認空餘堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制,能夠經過MinHeapFreeRatio參數進行調整;默認空餘堆內存大於70%時,JVM會減小堆直到-Xms的最小限制,能夠經過MaxHeapFreeRatio參數進行調整。blog

 

下面咱們來認識下非堆內存(非heap區) 
Code Cache:代碼緩存區,它主要用於存放JIT所編譯的代碼。CodeCache代碼緩衝區的大小在client模式下默認最大是32m,在server模式下默認是48m,這個值也是能夠設置的,它所對應的JVM參數爲ReservedCodeCacheSize 和 InitialCodeCacheSize,能夠經過以下的方式來爲Java程序設置。內存

-XX:ReservedCodeCacheSize=128m

CodeCache緩存區是可能被充滿的,當CodeCache滿時,後臺會收到CodeCache is full的警告信息,以下所示: 
「CompilerThread0」 java.lang.OutOfMemoryError: requested 2854248 bytes for Chunk::new. Out of swap space?

注:JIT編譯器是在程序運行期間,將Java字節碼編譯成平臺相關的二進制代碼。正由於此編譯行爲發生在程序運行期間,因此該編譯器被稱爲Just-In-Time編譯器。

相關文章
相關標籤/搜索