這裡向大家簡單介紹一下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
>
java
jar
verbose:gc
Xmn
mXX:+PrintGCDetailsSwingSet
jar[回車]
上面加入了一個新的參數
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
再去執行
鍵入如下指令
java
jar
verbose:gc
Xmn
m
Xmx
mXX:+PrintGCDetailsSwingSet
jar[回車]
得到的結果如下(節選)
[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