以下為某 Java 應用啟動初期的 GC 日誌片段,清晰記錄了從 Young GC 到頻繁 Full GC 的演變過程,典型反映老年代記憶體持續增長、無法回收的問題。
-XX:InitialHeapSize=132767616 -XX:MaxHeapSize=2124281856 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+UseCompressedOops -XX:+UseParallelGC
[GC [PSYoungGen: 33280K->5096K(38400K)] 33280K->23216K(124416K), 0.0302209 secs]
Eden 區 33MB 清理至 5MB,但老年代已佔用 18MB(23216K - 5096K),顯示對象過早晉升。
[Full GC [PSYoungGen: 5112K->483K(71680K)] [ParOldGen: 110536K->110472K(233472K)] 115648K->110956K(305152K), 1.0109616 secs]
老年代 110MB 僅回收 64KB,說明絕大多數對象仍被引用。
[Full GC [PSYoungGen: 199680K->199680K(418816K)] [ParOldGen: 1382776K->1382776K(1382912K)] 1582456K->1582456K(1801728K), 3.2446575 secs]
若干次 Full GC 後:Young GC 後對象完全進入老年代,老年代佔用 99.99%,每次 Full GC 耗時 3-4 秒,應用停頓比例超過 99%。
jmap -histo:live pid 查看存活對象統計jmap -dump:format=b,file=heap.hprof pid日誌呈現典型「老年代記憶體洩漏」特徵:Young GC 無法有效清理短命對象,大量對象過早晉升老年代,Full GC 頻繁且無效。調大堆、換 GC 演算法只能緩解症狀,必須通過 Heap Dump 分析定位具體洩漏代碼並修復。