Pod自動重啟問題排查:JDK 17 EA版本G1GC Bug導致的應用崩潰
問題背景
在生產環境中,我們遇到了一個嚴重的穩定性問題:應用Pod頻繁自動重啟,導致服務不穩定。通過深入分析JVM崩潰日志,最終定位到是JDK 17 EA版本中G1GC的一個已知Bug導致的。
問題現象
1. Pod重啟表現
- 應用Pod在運行一段時間后突然崩潰
- Kubernetes自動重啟Pod,但問題會重復出現
- 服務可用性受到嚴重影響
2. JVM崩潰日志分析
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00007f5be7327043, pid=1, tid=52
#
# JRE version: OpenJDK Runtime Environment (17.0+14) (build 17-ea+14)
# Java VM: OpenJDK 64-Bit Server VM (17-ea+14, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
# Problematic frame:
# V [libjvm.so+0x707043] G1ParCopyClosure<(G1Barrier)0, false>::do_oop(narrowOop*)+0x63
關鍵信息提取:
- JVM版本: OpenJDK 17.0+14 (build 17-ea+14) - 這是一個Early Access版本
- GC類型: G1GC (G1 Garbage Collector)
- 崩潰位置: G1ParCopyClosure在do_oop方法中發生段錯誤
- 崩潰線程: GC Thread#1,說明問題出現在垃圾回收過程中
3. 堆棧跟蹤分析
從堆棧跟蹤可以看出,崩潰發生在G1GC的并行復制階段:
V [libjvm.so+0x707043] G1ParCopyClosure<(G1Barrier)0, false>::do_oop(narrowOop*)+0x63
V [libjvm.so+0xb6f6c3] OopMapSet::oops_do(frame const*, RegisterMap const*, OopClosure*, DerivedPointerIt