OutOfMemoryError能被catch(Exception)捕获吗?

背景

写了一个 Kafka 消费者程序,Kafka 集群中数据量过大时,消费线程无故退出了,日志打印了心跳 OOM 异常信息:

但是消费线程里面的 run 方法里面明明包含了 catch (Exception e) ,结尾信息没有打印异常,为什么呢?

异常类体系结构复习

原因很简单: java.lang.OutOfMemoryError 这个异常类的顶层父类并不是 Exception,而是 Error

顺带复习下 Java 的异常类体系图:

此图来自《网络》

解决办法

我知道那个消费者线程退出肯定跟 OOM 异常有关,但是最初想没明白它退出的原因。后来看了下这个异常类的继承关系,改成 catch Throwable 后线程退出之前果然打印了该异常。

java.lang.OutOfMemoryError:Java heap space 这个异常的解决办法是对 JVM 参数进行调整,将 -Xmx 值由现在的 1G 改为 4G,就解决了。

启示录

开发中的异常捕获通常只到 Exception 类型就中止了,这个线程退出的情况,引发了一个思考:跟 JVM 相关的异常有没有必要捕获呢?

JVM相关的异常通常指的是Java虚拟机(JVM)自身抛出的错误,比如OutOfMemoryError、StackOverflowError等。这些异常是JVM的一部分,通常是严重错误,它们在程序的正常流程中不应该被捕获处理。

如果你尝试捕获这些异常,比如使用try-catch块,你会得到一个编译错误,因为这些异常是Error类型的,而不是Exception类型。Error类型的异常通常表示严重问题,应该让程序自然终止,而不是尝试恢复。

我想的也是不能捕获,内存空间不足时,程序已经无法继续运行了,即使捕获了 OOM ,后面线程继续运行还是一样的问题,治标不治本!

相关推荐
guodingdingh1 小时前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯3 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育3 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵3 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔4 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影5 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121316 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔6 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城7 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience8 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu