熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

全面認識JVM垃圾回收機制

2022-06-13   來源: Java核心技術 
    這裡向大家簡單介紹一下JVM垃圾回收的相關知識JVM使用的是分代垃圾回收的方式可以將Java對象分為年輕對象和年老對象JVM將內存堆(Heap)分為兩個區域一個是年輕另一個是Java將這兩個區域分別稱作是新生代老生代
   
    JVM垃圾回收的相關知識
   
    JVM使用的是分代垃圾回收的方式主要是因為在程序運行的時候會有如下特點
   
    ◆大多數對象在創建後很快就沒有對象使用它了
   
    ◆大多數在一直被使用的對象很少再去引用新創建的對象
   
    因此就將Java對象分為年輕對象和年老對象JVM將內存堆(Heap)分為兩個區域一個是年輕另一個是Java將這兩個區域分別稱作是新生代老生代
   
    新生代區域中絕大多數新創建的對象都存放在這個區域裡此區域一般來說較小而且JVM垃圾回收頻率較高同時因為新生代采用的算法和其存放的對象的特點使該區域JVM垃圾回收的效率也非常高
   
    而老生代區域中存放的是在新生代中生存了較長時間的對象這些對象將被轉移到老生代這個區域一般要大一些而且增長的速度相對於新生代要慢一些老生代JVM垃圾回收的執行頻率也會低很多
   
    由於JVM在JVM垃圾回收處理時會消耗一定的系統資源因此有時候通過JVM啟動的時候添加相關參數來控制新生代區域的大小來調整JVM垃圾回收處理的頻率非常有用以便於我們更合理的利用系統資源
   
    新生代區域設置參數是Xmn用這個參數可以制定新生代區域的大小
   
    我們來舉一個例子說明
   
    我們就用系統自帶的程序作為例子在命令行上鍵入如下指令
   
    CDC:\java\demo\jfc\SwingSet[回車]C:\java\demo\jfc\SwingSet>
   
    javajarverbose:gcXmnmXX:+PrintGCDetailsSwingSetjar[回車]
   
    上面加入了一個新的參數XX:+PrintGCDetails這個參數能夠打印出GC的詳細信息屏幕輸出如下(節選)
   
    [GC[DefNew:K>K(K)secs]K>
   
    K(K)secs][GC[DefNew:K>
   
    K(K)secs]K>
   
    K(K)secs][GC[DefNew:K>
   
    K(K)secs]K>
   
    K(K)secs][GC[DefNew:K>
   
    K(K)secs]K>
   
    K(K)secs]
   
    我們需要解釋一下輸出的詳細內容的意思拿第一行輸出來說
   
    DefNew:K>K(K)secs是指新生代的JVM垃圾回收情況這裡的意思是從占用K內存空間變為K內存空間用時
   
    K>K(K)secs是指總體GC的回收情況整體堆空間占用從K降低到K的水平用時
   
    那麼這時候我們在將新生代的內存設為M並把堆的最大可控值設定為M再去執行鍵入如下指令
   
    javajarverbose:gcXmnmXmxmXX:+PrintGCDetailsSwingSetjar[回車]
   
    得到的結果如下(節選)
   
    [GC[DefNew:K>K(K)secs]
   
    [Tenured:K>K(K)secs]K>
   
    K(K)secs][GC[DefNew:K>
   
    K(K)secs][Tenured:K>
   
    K(K)secs]K>
   
    K(K)secs][GC[DefNew:K>
   
    K(K)secs][Tenured:K>
   
    K(K)secs]K>
   
    K(K)secs]
   
    這個結果說明
   
    [DefNew:K>K(K)secs]是指新生代的JVM垃圾回收情況這裡的意思是從占用K內存空間變為K內存空間用時
   
    K>K(K)secs是指總體GC的回收情況整體堆空間占用從K降低到K的水平用時
   
    [Tenured:K>K(K)secs]是指老生代GC的回收情況整體堆空間占用從K降低到K的水平用時
   
    通過這些參數的調整我們可以看到在處理垃圾收集問題時從JVM垃圾回收的頻率是時間方面的變化我們可以根據不同程序的不同情況予以調整
   
    最後有必要提一下GC的相關參數
   
    XX:+PrintGCDetails顯示GC的詳細信息
   
    XX:+PrintGCApplicationConcurrentTime打印應用執行的時間
   
    XX:+PrintGCApplicationStoppedTime打印應用被暫停的時間
   
    注:後的+號表示開啟此選項如果是號那麼表示關閉此選項
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25648.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.