JDK 1.8 生产环境中,JVM 可能抛出的异常分类列表及触发场景说明

        在 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
  • 子类InternalErrorStackOverflowError、ClassFormatError 等,表示 JVM 内部错误。

        排查流程和解决方案
2. java.lang.NoSuchMethodError
  • 触发原因:方法签名不匹配(常见于依赖冲突)。

        排查流程和解决方案
3. java.lang.VerifyError
  • 触发原因:字节码验证失败(如 ASM 修改字节码错误)。

        排查流程和解决方案


六、容器环境特有异常

1. OOM Killer 终止 JVM
  • 现象:容器日志显示 Killeddmesg 中有 OOM 记录。

  • 原因:JVM 未限制堆外内存,超出容器限制。

  • 解决方案

    • 设置 -XX:MaxRAMPercentage

    • 限制直接内存:-XX:MaxDirectMemorySize


完整参数调优对照表

异常类型关键 JVM 参数监控工具
Java heap space-Xmx-Xmsjmap、MAT
Metaspace-XX:MaxMetaspaceSizejstat -gcmetacapacity
Direct buffer memory-XX:MaxDirectMemorySizeNMT(Native Memory Tracking)
Unable to create thread-Xss-XX:ParallelGCThreadsjstackpstree

生产环境诊断流程

  1. 捕获异常:通过 -XX:+HeapDumpOnOutOfMemoryError 生成 Dump 文件。

  2. 分析日志:结合 GC 日志(-Xloggc)和 jstat 输出。

  3. 工具定位

    • 内存泄漏:MAT 分析 java_pid12345.hprof

    • 线程阻塞:jstack -l <pid>

  4. 调优验证:通过压测对比调整前后的性能指标。


注意事项

  • 不要忽略 OutOfMemoryError:即使偶尔发生,也需彻底排查。

  • 容器环境:显式设置所有内存上限(堆、元空间、直接内存)。

  • 版本差异:JDK 1.8 与更高版本的部分异常行为可能不同(如 ZGC 的 OOM 表现)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值