应用OutOfMemoryError了,还能正常处理请求吗?

更多干货文章和福利在我的公众号:Hoeller,欢迎大家关注并联系我,一起探讨技术呀...

如果应用出现了OutOfMemoryError,应用还能正常工作吗?

单纯考虑Java其实是可以的 ,因为本质上当某次请求出现OutOfMemoryError时,只是表示JVM剩余可用内存小于该请求所需的内存 ,所以抛出OutOfMemoryError,但是如果其他请求所需要的内存比较小,JVM能够满足,那么JVM还是能继续处理其他请求的。

但是,如果在Linux中有一个机制:OOM killer(Out Of Memory killer) ,该机制会监控操作系统中内存占用过高的进程,操作系统一旦发现系统内存不足了,就会把占用内存最高的进程给kill掉。所以Java进程当出现OutOfMemoryError时,可能会触发OOM killer机制,从而被操作系统给kill掉,导致不能对外提供服务了。

比如,我有以下Controller:

每访问一次/test,就会消耗100m内存,但是访问/hello则基本不需要消耗内存。

指定-Xms200m -Xmx200m参数运行项目,第一次访问/test正常返回,第二次访问/test就会抛OutOfMemoryError了,只要抛了OutOfMemoryError就表示此次请求没有消耗掉内存(因为内存不够它消耗),此时程序仍然在运行中,此时访问/hello能正常得到结果。

接下来,我们来验证OOM killer机制 ,把上述SpringBoot应用打成可执行Jar并上传到阿里云服务器上,服务器内存为512m,通过运行以下命令启动程序:

第一次访问test正常得到结果,第二次访问test时Java进程就直接被kill掉了,截图为:

所以,在给Java程序设置内存参数时,不能设置得太大,不然很有可能就被操作系统给kill掉了

好啦,关于OutOfMemoryError就介绍到这啦,下次继续分享关于JVM的知识,欢迎大家关注我的公众号:Hoeller,第一时间接收我的原创技术文章,谢谢大家的阅读。

相关推荐
Ai拆代码的曹操10 小时前
RocketMQ 消息堆积排查实战:从 20 个消费者线程卡死到 rebalance 死亡螺旋
后端·rocketmq
吃饱了得干活11 小时前
@Transactional 又失效了?把这 8 个坑全填了!
java·后端·spring
颜进强11 小时前
从零搭建私人 RAG 知识库:让项目决策真正“可检索、可追溯”
前端·后端·ai编程
颜进强11 小时前
Embedding 模型介绍:热门模型对比与应用场景
前端·后端·ai编程
颜进强11 小时前
LanceDB 基础使用:用 TypeScript 完成第一次向量检索
前端·后端·ai编程
武子康11 小时前
低延迟不是更快地猜:EOU / Barge-in / Turn Protocol 必须统一(4 种结束 + Generation Fencing + 9 类可复现场景)
人工智能·后端·llm
颜进强11 小时前
Ollama 从入门到实践:本地模型运行、API 调用
前端·后端·ai编程
今天AI了吗11 小时前
Spring AI 框架实战:Java 后端集成大模型的架构设计与工程落地
java·人工智能·python·spring·机器学习
颜进强11 小时前
Embedding 基础使用:用 Ollama 和 LangChain.js 生成文本向量
前端·后端·ai编程
颜进强11 小时前
Vector Store 入门:什么是向量数据库,主流产品如何选择
前端·后端·ai编程