InternalError是JVM自身崩溃导致的严重错误,属VirtualMachineError子类,表明JVM状态异常、内存损坏或native调用失败,通常伴随进程退出;需优先分析hs_err_pid*.log中的Problematic frame、线程信息及内存使用情况。

看 hs_err_pid.log 里的 Problematic frame
崩溃是否由本地库引起,第一眼就看 hs_err_pid*.log 中的 Problematic frame 行。如果它指向 .so(Linux)或 .dll(Windows)文件,基本可以锁定是 native 层问题。
常见错误模式:
-
C [libxxx.so+0x12345] some_func+0x2a→ 第三方 native 库函数内崩溃 -
C [libc.so.6+0x89abc] malloc+0x1c→ 系统 libc 调用出错(可能因堆外内存越界或 double-free) -
V [libjvm.so+0xabcdef] ...→ JVM 自身代码问题(非本地库,但需结合版本查已知 Bug)
注意 Loaded Libraries 段,确认该库是否为应用主动加载(如 System.loadLibrary("xxx")),还是被间接依赖(比如 Netty 的 netty-transport-native-epoll)。
用 gdb 分析 core dump 定位调用上下文
仅靠 hs_err_pid.log 往往不够——它只记录崩溃瞬间的寄存器和栈顶几帧。要看到完整 native 调用链,必须用 gdb 加载 core 文件:
gdb /path/to/java core
进 gdb 后执行:
-
bt:查看完整 native 堆栈(重点关注你自己的库函数、JNI 入口点) -
info registers:检查崩溃时寄存器值(如rip对应pc,rdi/rax是否为非法地址) -
frame 3(跳到某一层)→list:若源码已编译调试信息,可直接看到对应 C/C++ 行
关键前提:ulimit -c unlimited 已生效,且 JVM 启动加了 -XX:+CreateCoredumpOnCrash;否则没有 core 可分析。
检查 JNI 调用是否违反 JVM 规范
很多本地库崩溃源于 JNI 使用不当,而非库本身有 bug。以下是最常踩的坑:
- 在 native 代码中缓存
jobject或jclass,未转为 global ref,跨线程或跨 JNI 调用后使用 → 解引用空指针或野指针 - 调用
env->NewStringUTF()传入含嵌入 null 字节的字符串 → 导致 JVM 内部解析越界 - 在 native 方法中抛出 Java 异常后未返回,继续执行后续逻辑 → JVM 状态不一致
- 直接操作
jbyteArray返回的指针,未用GetByteArrayElements()/ReleaseByteArrayElements()配对 → 内存管理失控
建议在开发阶段启用 JNI Check:-Xcheck:jni。它会在每次 JNI 调用时做合法性校验(性能损耗大,仅用于排查)。
区分 OpenJDK 版本与本地库的兼容性问题
OpenJDK 不同版本对 JNI 接口、内部结构(如 OopDesc 布局)、GC 线程行为的实现可能不同。一个在 OpenJDK 11 上稳定的本地库,升级到 OpenJDK 17 后可能因 G1 GC 并发标记机制变化而触发竞态崩溃。
典型线索:
- 崩溃帧出现在
G1ParCopyClosure::do_oop、ShenandoahBarrierSet::load_reference_barrier等 GC 相关函数中 → 很可能是本地库绕过 JVM 安全屏障直接操作对象头 - 仅在高并发压测下复现,单线程稳定 → 暗示 native 代码未正确处理多线程/重入
- 切换回 OracleJDK 或旧版 OpenJDK 后问题消失 → 锁定为 OpenJDK 特定版本的变更影响
此时不要急着改库代码,先查对应 OpenJDK 版本的 JDK Bug System(如 JDK-82XXXXX),关键词搜 jni crash + your lib name + g1/shenandoah。
最易被忽略的一点:本地库崩溃往往不是“库坏了”,而是它暴露了 JVM 或应用层长期存在的资源管理缺陷——比如堆外内存泄漏导致 mmap 失败,再比如 JNI 调用频繁触发 GC,让原本脆弱的 native 逻辑在 STW 边界上失守。盯住 hs_err_pid.log 里的 Java Threads 和 VM Thread 状态,比单纯分析 native 堆栈更能定位根因。


















