???????? 關于java se的垃圾回收器以前一只都沒怎么了解,今天一次偶然的機會.我知道了命令行的java 還有個參數 -verbose:gc 可以即時的刷新java程序的內存使用情況.用來測試的程序就是在不斷的相加兩個很大的字符串對象.以下就是程序執行時的輸出信息.
[GC 409K->233K(1984K), 0.0058250 secs]???//從這到第六行中間的圓括號里都是1984k.我猜這應該是堆的大小吧.
[GC 718K->510K(1984K), 0.0025204 secs]
[GC 774K->771K(1984K), 0.0014421 secs]
[GC 1201K->939K(1984K), 0.0013013 secs]
[GC 1444K->1274K(1984K), 0.0013242 secs]
[GC 1687K->1685K(2400K), 0.0017393 secs]???//堆大小變為2400k,將會執行垃圾回收器
[Full GC 1685K->532K(2400K), 0.0315082 secs]???
//這里開始啟動垃圾回收器,注意后面的時間,基本上是上面的30倍.可見垃圾回收器是多么的占資源.
[GC 943K->943K(1984K), 0.0019234 secs]???//執行gc后堆大小變為1984k
[GC 1431K->1429K(2228K), 0.0078479 secs]???//堆大小變為2400k,將會執行垃圾回收器
[Full GC 1429K->607K(2228K), 0.0260561 secs]???//gc()
[GC 1093K->1093K(1984K), 0.0017910 secs]???
[GC 1376K->1374K(1984K), 0.0009124 secs]
[GC 1654K->1654K(2268K), 0.0015390 secs]
[Full GC 1654K->682K(2268K), 0.0264760 secs]
[GC 1563K->1561K(2304K), 0.0019106 secs]???
[Full GC 1561K->439K(2304K), 0.0331671 secs]
[GC 757K->757K(1984K), 0.0013675 secs]
[Full GC 757K->757K(1984K), 0.0263450 secs]
[GC 1751K->1749K(2340K), 0.0020385 secs]
[Full GC 1749K->477K(2340K), 0.0268218 secs]
[GC 833K->833K(1984K), 0.0015278 secs]
[Full GC 833K->833K(1984K), 0.0245162 secs]
[GC 1939K->1937K(2696K), 0.0014709 secs]???//(注意紅色)所相加的兩個字符串已經越來越大,以至頻繁的啟動gc,于是擴大的堆容量
[GC 2331K->2331K(3092K), 0.0040047 secs]
[Full GC 2331K->908K(3092K), 0.0268548 secs]
...........
結論:java se的垃圾回收器一般是在堆容量超出預分配時才會啟動,執行完畢后,再把堆變成以前的大小.但是如果頻繁的啟動gc,VM則會擴大堆容量.如上面的2696k.
以上都是我根據打印出的信息所做出的推測,不知道對不對.歡迎批評.
[GC 409K->233K(1984K), 0.0058250 secs]? 還有右邊藍色的部分我不知道是什么意思,希望知道的達人告訴下.