Java GC類型:
Java中的GC有哪幾種類型踱稍?
UseSerialGC
虛擬機(jī)運(yùn)行在Client模式的默認(rèn)值,打開此開關(guān)參數(shù)后固棚,
使用Serial+Serial Old收集器組合進(jìn)行垃圾收集都弹。
UseParNewGC
打開此開關(guān)參數(shù)后,使用ParNew+Serial Old收集器組合進(jìn)行垃圾收集锣杂。
UseConcMarkSweepGC
打開此開關(guān)參數(shù)后脂倦,使用ParNew+CMS+Serial Old收集器組合進(jìn)行垃圾收集。Serial Old作為CMS收集器出現(xiàn)Concurrent Mode Failure的備用垃圾收集器元莫。
UseParallelGC
虛擬機(jī)運(yùn)行在Server模式的默認(rèn)值赖阻,打開此開關(guān)參數(shù)后,使用Parallel Scavenge+Serial Old收集器組合進(jìn)行垃圾收集踱蠢。
UseParallelOldGC
打開此開關(guān)參數(shù)后政供,使用Parallel Scavenge+Parallel Old收集器組合進(jìn)行垃圾收集。
在Java程序啟動(dòng)完成后朽基,通過jps觀察進(jìn)程來查詢到當(dāng)前運(yùn)行的java進(jìn)程布隔,使用
jinfo –flag UseSerialGC 進(jìn)程
的方式可以定位其使用的gc策略,因?yàn)檫@些參數(shù)都是boolean型的常量稼虎,如果使用該種gc策略會(huì)出現(xiàn)+號(hào)衅檀,否則-號(hào)。
使用-XX:+上述GC策略可以開啟對(duì)應(yīng)的GC策略霎俩。
GC日志查看
可以通過在java命令種加入?yún)?shù)來指定對(duì)應(yīng)的gc類型哀军,打印gc日志信息并輸出至文件等策略。
GC的日志是以替換的方式(>)寫入的打却,而不是追加(>>)杉适,如果下次寫入到同一個(gè)文件中的話,以前的GC內(nèi)容會(huì)被清空柳击。
對(duì)應(yīng)的參數(shù)列表
-XX:+PrintGC 輸出GC日志-XX:+PrintGCDetails 輸出GC的詳細(xì)日志-XX:+PrintGCTimeStamps 輸出GC的時(shí)間戳(以基準(zhǔn)時(shí)間的形式)-XX:+PrintGCDateStamps 輸出GC的時(shí)間戳(以日期的形式猿推,如 2013-05-04T21:53:59.234+0800)-XX:+PrintHeapAtGC 在進(jìn)行GC的前后打印出堆的信息-Xloggc:../logs/gc.log 日志文件的輸出路徑
這里使用如下的參數(shù)來進(jìn)行日志的打印:
-XX:+PrintGCDateStamps -XX:+PrintGCDetails -Xloggc:./gclogs
對(duì)于新生代回收的一行日志捌肴,其基本內(nèi)容如下:
2014-07-18T16:02:17.606+0800: 611.633: [GC 611.633: [DefNew: 843458K->2K(948864K), 0.0059180 secs] 2186589K->1343132K(3057292K), 0.0059490 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
其含義大概如下:
2014-07-18T16:02:17.606+0800(當(dāng)前時(shí)間戳): 611.633(時(shí)間戳): [GC(表示Young GC) 611.633: [DefNew(單線程Serial年輕代GC): 843458K(年輕代垃圾回收前的大械虐取)->2K(年輕代回收后的大小)(948864K(年輕代總大凶粗)), 0.0059180 secs(本次回收的時(shí)間)] 2186589K(整個(gè)堆回收前的大谢辔濉)->1343132K(整個(gè)堆回收后的大小)(3057292K(堆總大屑病)), 0.0059490 secs(回收時(shí)間)] [Times: user=0.00(用戶耗時(shí)) sys=0.00(系統(tǒng)耗時(shí)), real=0.00 secs(實(shí)際耗時(shí))]
老年代回收的日志如下:
2014-07-18T16:19:16.794+0800: 1630.821: [GC 1630.821: [DefNew: 1005567K->111679K(1005568K), 0.9152360 secs]1631.736: [Tenured:2573912K->1340650K(2574068K), 1.8511050 secs] 3122548K->1340650K(3579636K), [Perm : 17882K->17882K(21248K)], 2.7854350 secs] [Times: user=2.57 sys=0.22, real=2.79 secs]
gc日志中的最后貌似是系統(tǒng)運(yùn)行完成前的快照:
Heap def new generation total 1005568K, used 111158K [0x00000006fae00000, 0x000000073f110000, 0x0000000750350000) eden space 893888K, 12% used [0x00000006fae00000, 0x0000000701710e90, 0x00000007316f0000) from space 111680K, 3% used [0x0000000738400000, 0x000000073877c9b0, 0x000000073f110000) to space 111680K, 0% used [0x00000007316f0000, 0x00000007316f0000, 0x0000000738400000) tenured generation total 2234420K, used 1347671K [0x0000000750350000, 0x00000007d895d000, 0x00000007fae00000) the space 2234420K, 60% used [0x0000000750350000, 0x00000007a2765cb8, 0x00000007a2765e00, 0x00000007d895d000) compacting perm gen total 21248K, used 17994K [0x00000007fae00000, 0x00000007fc2c0000, 0x0000000800000000) the space 21248K, 84% used [0x00000007fae00000, 0x00000007fbf92a50, 0x00000007fbf92c00, 0x00000007fc2c0000)No shared spaces configured.
GC日志的離線分析
可以使用一些離線的工具來對(duì)GC日志進(jìn)行分析坦喘,比如sun的gchisto( https://java.net/projects/gchisto)盲再,gcviewer( https://github.com/chewiebug/GCViewer ),這些都是開源的工具瓣铣,用戶可以直接通過版本控制工具下載其源碼洲胖,進(jìn)行離線分析。
下面就已gcviewer為例坯沪,簡(jiǎn)要分析一下gc日志的離線分析绿映,gcviewer源代碼工程是maven結(jié)構(gòu)的,可以直接用maven進(jìn)行package腐晾,這里編譯的是1.34版本叉弦,本版本的快照已經(jīng)上傳至附件中。
需要說明的是藻糖,gcviewer支持多種參數(shù)生成的gc日志淹冰,直接通過java –jar的方式運(yùn)行,加載生成的gc日志即可: