在 JDK 1.8 的生产环境中,JVM 可能抛出的异常主要分为 内存相关、GC相关、线程相关 和 运行时异常。以下是完整的分类列表及触发场景说明:
一、内存相关异常
1. OutOfMemoryError: Java heap space
-
触发原因:堆内存不足,无法分配新对象。
-
排查工具:
jmap -histo
、MAT 分析 Heap Dump。 -
解决方案:
-
增大
-Xmx
。 -
检查内存泄漏(如未关闭的集合、缓存)。
-
排查流程和解决方案
2. OutOfMemoryError: Metaspace
-
触发原因:元空间(类元数据区)耗尽。
-
关键参数:
-XX:MaxMetaspaceSize
。 -
常见场景:
-
动态类加载(Groovy、反射生成类)。
-
类加载器泄漏(如热部署未卸载旧类)。
-
排查流程和解决方案
3. OutOfMemoryError: Direct buffer memory
-
触发原因:直接内存(NIO 使用的堆外内存)不足。
-
关键参数:
-XX:MaxDirectMemorySize
。 -
典型案例:Netty 未正确释放
ByteBuf
。
排查流程和解决方案
4. OutOfMemoryError: Unable to create new native thread
-
触发原因:线程数超过系统限制(
ulimit -u
)。 -
排查命令:
pstree -p <pid>
或jstack
。 -
调优建议:
-
减小
-Xss
(线程栈大小)。 -
优化线程池配置。
-
排查流程和解决方案
5. OutOfMemoryError: GC overhead limit exceeded
-
触发原因:GC 耗时超过 98% 且回收率低于 2%。
-
解决方案:
-
增大堆内存。
-
切换 GC 算法(如 G1)。
-
二、GC 相关异常
1. java.lang.StackOverflowError
-
触发原因:线程栈溢出(递归调用过深)。
-
参数调优:
-Xss
(默认 1MB,可减小到 256k)。
排查流程和解决方案
2. java.lang.IllegalArgumentException: GC triggered before VM initialized
-
触发原因:JVM 启动参数矛盾(如
-Xms
> 物理内存)。
三、线程与锁异常
1. java.lang.IllegalMonitorStateException
-
触发原因:未在同步块中调用
wait()
/notify()
。
2. java.util.concurrent.RejectedExecutionException
-
触发原因:线程池任务队列已满且拒绝策略触发。
3. java.lang.ThreadDeath
(罕见)
-
触发原因:线程被强制终止(
Thread.stop()
)。
四、类加载异常
1. java.lang.NoClassDefFoundError
-
触发原因:类编译时存在但运行时缺失(如依赖冲突)。
排查流程和解决方案
2. java.lang.ClassNotFoundException
-
触发原因:类加载器未找到指定类。
排查流程和解决方案
3. java.lang.UnsupportedClassVersionError
-
触发原因:JDK 版本不兼容(如用 JDK 11 编译,JDK 8 运行)。
五、运行时异常
1. java.lang.VirtualMachineError
-
子类:
InternalError
、StackOverflowError、
ClassFormatError 等,表示 JVM 内部错误。
排查流程和解决方案
2. java.lang.NoSuchMethodError
-
触发原因:方法签名不匹配(常见于依赖冲突)。
排查流程和解决方案
3. java.lang.VerifyError
-
触发原因:字节码验证失败(如 ASM 修改字节码错误)。
六、容器环境特有异常
1. OOM Killer 终止 JVM
-
现象:容器日志显示
Killed
,dmesg
中有 OOM 记录。 -
原因:JVM 未限制堆外内存,超出容器限制。
-
解决方案:
-
设置
-XX:MaxRAMPercentage
。 -
限制直接内存:
-XX:MaxDirectMemorySize
。
-
完整参数调优对照表
异常类型 | 关键 JVM 参数 | 监控工具 |
---|---|---|
Java heap space | -Xmx 、-Xms | jmap 、MAT |
Metaspace | -XX:MaxMetaspaceSize | jstat -gcmetacapacity |
Direct buffer memory | -XX:MaxDirectMemorySize | NMT(Native Memory Tracking) |
Unable to create thread | -Xss 、-XX:ParallelGCThreads | jstack 、pstree |
生产环境诊断流程
-
捕获异常:通过
-XX:+HeapDumpOnOutOfMemoryError
生成 Dump 文件。 -
分析日志:结合 GC 日志(
-Xloggc
)和jstat
输出。 -
工具定位:
-
内存泄漏:MAT 分析
java_pid12345.hprof
。 -
线程阻塞:
jstack -l <pid>
。
-
-
调优验证:通过压测对比调整前后的性能指标。
注意事项
-
不要忽略
OutOfMemoryError
:即使偶尔发生,也需彻底排查。 -
容器环境:显式设置所有内存上限(堆、元空间、直接内存)。
-
版本差异:JDK 1.8 与更高版本的部分异常行为可能不同(如 ZGC 的 OOM 表现)。