這是 HBase 的 GC log澎蛛。
遺憾由于沒有加 -XX:+PrintHeapAtGC 參數(shù)啡彬,日志只有這些压真。
暴露的問題:
YGC 時(shí)間久杆煞,需要 3 至 5 秒魏宽,與出現(xiàn)問題之前的 20ms 有很大差距。
JVM 配置如下:
堆大小 30G决乎。
年輕代 3G队询,SurvivorRatio = 2,E 和 S 的大小分別為 1.5G 和 0.75G构诚。
從日志中可以推斷出蚌斩,應(yīng)該是 survivor 區(qū)空間少,導(dǎo)致存活對象超出 Desired survivor size = 0.75G * 50% = 402653184b范嘱,晉升閾值調(diào)整為 1送膳,對象過早進(jìn)入老年代導(dǎo)致。
圖中第一次 YGC 的時(shí)間為 20ms丑蛤,比較正常叠聋。加了 PrintTenuringDistribution 參數(shù),看到對象分布受裹。
從很多文章中寫到垮抗,PrintTenuringDistribution 打印的是 survivor 區(qū)的對象分布。
但日志中看到 812976448 total乐横,約等于 775M,大于 survivor 區(qū)的 768M镇匀。
所以我將這個(gè)統(tǒng)計(jì)理解成希望進(jìn)入 survivor to 區(qū)的對象分布?
第一次正常 YGC 時(shí)袜啃,單是年齡為 1 的對象就超過了 survivor 區(qū)的大小汗侵。
所以 YGC 之后,survivor 區(qū)被年齡為 1 的對象填滿群发,并且由于 survivor 區(qū)的占比超過了 50%晃择,晉升閾值被調(diào)整為 1。在之后的 YGC 中也物,非新分配對象直接晉升到老年代宫屠。
在之后的 YGC 中,可以看到滑蚯,每次 GC 之后浪蹂,年輕代占用的內(nèi)存均為 786432K = 0.75G,恰好為一個(gè) survivor 區(qū)的大小告材。
認(rèn)為之后新分配的存活對象在 YGC 后坤次,占滿了 survivor to 區(qū)。
但如果將 PrintTenuringDistribution 分布理解成期望進(jìn)入 survivor 區(qū)的對象分布斥赋。
但是第一次異常 YGC 發(fā)生時(shí)缰猴,對象總數(shù)只用 773677304b 約等于 738M,不足以填滿 survivor 區(qū)的 768M疤剑。
很是疑惑滑绒,求指點(diǎn)。