Pod自动重启问题排查:JDK 17 EA版本G1GC Bug导致的应用崩溃
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