在Java,Android,C#等中,GC是自動(dòng)的,而在幾種前代編程語言(C,C ++)中,程序員必須明確編寫代碼才能釋放對(duì)象。 所以,這對(duì)于Java,Android和C#應(yīng)用程序開發(fā)人員來說是一個(gè)很大的方便。 但這種自動(dòng)垃圾收集不是免費(fèi)的,它有一個(gè)代價(jià)。 自動(dòng)GC可以對(duì)以下方面產(chǎn)生比較明顯的的影響:
程序響應(yīng)時(shí)間
CPU
內(nèi)存
程序響應(yīng)時(shí)間
在進(jìn)行自動(dòng)GC對(duì)象,整個(gè)應(yīng)用程序必須間歇性地暫停,以標(biāo)記正在使用的對(duì)象,并清除未使用的對(duì)象。 在這個(gè)暫停期間,應(yīng)用程序中正在運(yùn)行的所有客戶端處理將被凍結(jié)(即凍結(jié))。 根據(jù)您配置的GC算法和內(nèi)存設(shè)置的類型,暫停時(shí)間可以從幾毫秒到幾秒到幾分鐘。 因此,垃圾收集可以顯著影響您的應(yīng)用程序SLA(服務(wù)級(jí)別協(xié)議)。
CPU
GC消耗了大量的CPU時(shí)間偏。 每個(gè)應(yīng)用程序?qū)⒂谐汕先f個(gè)存在內(nèi)存中的對(duì)象。 內(nèi)存中的每個(gè)對(duì)象都應(yīng)定期進(jìn)行調(diào)查,看它們是否在使用中。 如果正在使用,誰在引用它? 這些引用仍然活躍嗎? 如果他們沒有被使用,他們應(yīng)該從內(nèi)存中移除。 所有這些調(diào)查和計(jì)算都需要大量的CPU能力。
內(nèi)存
當(dāng)然,糟糕的GC配置會(huì)導(dǎo)致高內(nèi)存消耗,反之亦然。 在飽和其他資源(CPU,網(wǎng)絡(luò)帶寬,存儲(chǔ))之前,大多數(shù)應(yīng)用程序首先飽和內(nèi)存。 大多數(shù)應(yīng)用程序升級(jí)其EC2實(shí)例大小,以獲得額外的內(nèi)存,而不是獲得額外的CPU或網(wǎng)絡(luò)帶寬。
因此,為了讓您的云托管服務(wù)提供商擁有一流的SLA并減少費(fèi)用,您的應(yīng)用程序的垃圾收集必須能夠有效運(yùn)行。 為了研究和優(yōu)化垃圾回收對(duì)應(yīng)用程序性能的影響,必須啟用垃圾回收日志。 除此之外,垃圾收集日志可以用來解決應(yīng)用程序中與內(nèi)存有關(guān)的問題。
啟用GC日志
GC日志記錄可以通過在應(yīng)用程序啟動(dòng)過程中傳遞下面提到的系統(tǒng)屬性來啟用。
Java 8之前是這樣配置的:-XX:+PrintGCDetails -Xloggc:<gc-log-file-path>,例如我們的項(xiàng)目是:-XX:+PrintGCDetails -Xloggc:/opt/tmp/myapp-gc.log
Java 9是這樣的配置的:-Xlog:gc:file=<gc-log-file-path>,我們的項(xiàng)目的寫法就是:-Xlog:gc:file=/opt/tmp/myapp-gc.log
怎么分析GC日志
GC日志具有豐富的信息,但是理解GC日志并不容易。 沒有足夠的文檔來解釋GC日志格式。 最重要的是,GC日志格式不是標(biāo)準(zhǔn)化的。 它的性能因JVM供應(yīng)商(Oracle,IBM,HP,Azul等),Java版本(1.4,5,6,7,8,9),GC算法(串行,并行,CMS,G1,Shenandoah),GC系統(tǒng)屬性 (-XX:+ PrintGC,-XX:+ PrintGCDetails,-XX:+ PrintGCDateStamps,-XX:+ PrintHeapAtGC ...)。 基于這種排列和組合,很容易有60多種不同的GC日志格式。
因此,為了分析GC日志,強(qiáng)烈建議使用GC日志分析工具,如GCeasy,HPJmeter。 這些工具解析GC日志,并生成數(shù)據(jù)的良好圖形可視化,報(bào)告關(guān)鍵性能指標(biāo)和其他一些有用的指標(biāo)。
GCeasy是一個(gè)很棒的工具。你可以試著去使用使用。對(duì)大家的分析有很大的幫助。