1 GC日志中Times代表什么意思?
2015-05-26T14:45:37.987-0200 : 151.126 : [GC [PSYoungGen: 142816K->10752K(142848K)] 246648K->243136K(375296K),0.0935090secs][Times: user=0.55,sys=0.10, real=0.09secs]
2015-05-26T14:45:37.987-0200 : GC事件(GC event)開始的時(shí)間點(diǎn)。對(duì)應(yīng)參數(shù):-XX:+PrintGCDateStamps
151.126 : GC時(shí)間的開始時(shí)間,相對(duì)于JVM的啟動(dòng)時(shí)間,單位是秒(Measured in seconds)。對(duì)應(yīng)參數(shù):XX:+PrintGCTimeStamps
user是用戶態(tài)耗費(fèi)的時(shí)間(單核CPU用時(shí)),sys是內(nèi)核態(tài)耗費(fèi)的時(shí)間(單核CPU用時(shí)),real是整個(gè)過程實(shí)際花費(fèi)的時(shí)間。
它顯示了GC運(yùn)行的“真實(shí)”時(shí)間(0.09秒是0.0929090秒的近似值)。如果CPU時(shí)間(譯者注:0.55秒+0.10秒)明顯多于”真實(shí)“時(shí)間(譯者注:0.09秒),我們可以得出結(jié)論:GC使用了多線程運(yùn)行。這樣的話CPU時(shí)間就是所有GC線程所花費(fèi)的CPU時(shí)間的總和。實(shí)際上我們的例子中的垃圾收集器使用了8個(gè)線程。
例: [GC (Allocation Failure) 151.126: [DefNew: 629119K->69888K(629120K), 0.0584157 secs] 1619346K->1273247K(2027264K), 0.0585007 secs][Times: user=0.06 sys=0.00, real=0.06 secs] .由于垃圾收集器是DefNew,使用單個(gè)線程, 所以 real time 等于 user 以及 system time 的總和,沒有延遲程序的耗時(shí)。
real 從程序開始到程序執(zhí)行結(jié)束時(shí)所消耗的時(shí)間,包括CPU的用時(shí)和所有延遲程序執(zhí)行的因素的總和。
cpu用時(shí)被劃分為user和sys兩塊。user表示程序本身,以及它所調(diào)用的庫中的子例程使用的時(shí)間。sys是由程序直接或間接調(diào)用的系統(tǒng)調(diào)用執(zhí)行的時(shí)間。
real=cpu用時(shí)+其他因素時(shí)間,
cpu用時(shí)=user+sys
所以: real >= user + sys (單核情況)
在多處理器的系統(tǒng)上,一個(gè)進(jìn)程如果有多個(gè)線程或者有多個(gè)子進(jìn)程可能導(dǎo)致Real time比CPU time(User + Sys time)要小,這是因?yàn)椴煌木€程或進(jìn)程可以并行執(zhí)行。(?http://blog.sciencenet.cn/blog-830496-782593.html )
2 合適的調(diào)整新生代的大小(Xmn)
-Xmn 設(shè)置新生代大小。等價(jià)于 設(shè)置 -XX:NewSize和 -XX:MaxNewSize 這兩個(gè)參數(shù)
新生代太小導(dǎo)致Mionr的頻率大幅上升,也會(huì)導(dǎo)致大量對(duì)象進(jìn)入舊生代,觸發(fā)FullGC。
新生代太大,導(dǎo)致老生代太小,F(xiàn)ullGC頻率上升,也有可能導(dǎo)致MinorGC的時(shí)間上升。
官方推薦配置為整個(gè)堆的3/8
3 Xms和Xmx
JVM初始分配的堆內(nèi)存由-Xms指定,默認(rèn)是物理內(nèi)存的1/64;JVM最大分配的堆內(nèi)存由-Xmx指定,默認(rèn)是物理內(nèi)存的1/4。默認(rèn)空余堆內(nèi)存小于40%時(shí),JVM就會(huì)增大堆直到-Xmx的最大限制;空余堆內(nèi)存大于70%時(shí),JVM會(huì)減少堆直到-Xms的最小限制。
因此服務(wù)器一般設(shè)置-Xms、-Xmx 相等以避免在每次GC 后調(diào)整堆的大小。
說明:如果-Xmx 不指定或者指定偏小,應(yīng)用可能會(huì)導(dǎo)致java.lang.OutOfMemory錯(cuò)誤,此錯(cuò)誤來自JVM,不是Throwable的,無法用try...catch捕捉