当前位置: 首页 > news >正文

StackOverFlowError 和 OutOfMemoryError 的区别

StackOverflowErrorOutOfMemoryError 都是 JVM 抛出的严重错误,接下来我们简单看一下他们的区别。

StackOverFlowError:栈内存不够深(线程调用 栈深度 超出限制)。

OutOfMemoryError:目标内存区域不够大(堆、方法区等共享内存区域 容量耗尽,无法为新对象分配足够空间)。

关于 JVM 的组成部分,大家可以看下这篇博文:JVM的组成部分。

一、StackOverFlowError:栈溢出

1、定义

单个线程的方法调用栈深度超出 JVM 允许的最大值 时,虚拟机栈无法再创建新的栈帧,触发此错误。

2、原因

  • 方法调用链过长(如 无限递归、深层递归);
  • 单个 栈帧过大(如方法内定义了超大的局部变量数组)。

3、场景

  • 最典型:无终止条件的递归调用(方法反复调用自身,栈帧持续叠加)。
public class StackOverFlowTest {// 递归调用,无终止条件public static void recursiveCall() {recursiveCall(); // 方法自身调用,栈帧不断入栈}public static void main(String[] args) {recursiveCall(); // 运行结果:Exception in thread "main" java.lang.StackOverflowError}
}
  • 深层 嵌套 调用(如 A 调用 B,B 调用 C,… 嵌套 10000+ 层)。

二、OutOfMemoryError(OOM):内存不足

1、定义

某块共享内存区域(堆、元空间等)容量耗尽,且 GC 无法回收足够内存 时,JVM 无法为新对象分配空间,触发此错误。

2、原因

  • 内存泄漏(无用对象被 GC Root 引用,无法回收,持续占用内存);
  • 内存分配 过小(如堆内存 -Xmx 设置过小,无法满足业务对象创建需求);
  • 超大对象 直接超出内存限制(如创建 new byte[1024*1024*1024],超出堆最大容量)。

内存泄漏 可参考此博文 Java 哪些情况会导致内存泄漏。

3、场景

  • 堆内存 OOM:创建大量对象且无法被 GC 回收(如静态集合持有对象)。
  • 元空间 OOM:动态生成大量类(如 Spring / CGLIB 动态代理、频繁加载类文件),元空间(存储类信息)耗尽。
  • 栈内存 OOM(与 StackOverFlowError 不一样):创建大量线程(每个线程占用独立栈内存),总栈内存超出物理内存限制(不是单个线程栈深度,而是线程数量过多)。

一般来说,StackOverflowError 的错误日志会包含 java.lang.StackOverflowError + 方法调用栈(at XXX.XXX.method(...))OutOfMemoryError 的错误日志会有 Java heap space、Metaspace、Direct buffer memory 等标注,这些信息便于我们直接定位。

StackOverflowError 像是 一条单行道上的车排得太长,堵死了(栈帧太多)。

OutOfMemoryError 像是 一个停车场停满了车,再也没有空位(堆空间不足)。

当服务出现 StackOverflowError 或者 OutOfMemoryError 时,服务会处于 不稳定 状态,甚至会自动关闭,此时,我们需及时排查原因。

同为万里江湖客,共见三生风月身。-- 烟沙九洲

http://www.jsqmd.com/news/161141/

相关文章:

  • 国家重点研发计划推荐环境:PyTorch-CUDA-v2.7合规性说明
  • SQL Server - Session settings in procedure
  • Markdown撰写技术博客:结合PyTorch-CUDA-v2.7镜像输出实验结果
  • PyTorch安装失败终极解决:CUDA驱动不兼容?用v2.7镜像绕过难题
  • 惊人应用!提示工程架构师的数据驱动策略助力AI提示优化可扩展性
  • 基于PyTorch-CUDA-v2.7镜像的NLP任务实战:文本分类全流程
  • YOLOv11模型训练实战:基于PyTorch-CUDA-v2.7镜像的完整流程
  • FLIR 5G相机及采集卡sensemos
  • 如何最好地制定自动化测试策略
  • 进一步探索了解 task_struct 中 mm_struct 如何管理虚拟内存区域(VMA),以及GOT和PLT如何与位置无关代码(PIC)配合工作
  • 如何将本地PyTorch项目迁移到CUDA-v2.7镜像环境中?
  • Travis CI已停用?转向GitHub Actions的新配置
  • PyTorch-CUDA-v2.7镜像下载统计数据:年度报告摘要
  • PyTorch-CUDA-v2.7镜像权限管理策略:多用户共享环境设置
  • 国产操作系统兼容性测试:PyTorch-CUDA-v2.7在UOS上运行
  • 深入了解特定工具(Conan的私有仓库搭建,以及vcpkg的具体自定义 triplet)
  • 开源协议兼容性分析:与MIT、Apache项目集成注意事项
  • 多卡并行训练入门:PyTorch-CUDA-v2.7镜像支持NVIDIA显卡集群
  • SBOM软件物料清单生成:PyTorch-CUDA-v2.7符合信创要求
  • 制造业 CRM 软件选型指南:评估维度、推荐方案、行动计划
  • PyTorch-CUDA-v2.7镜像支持ARM架构吗?现状说明
  • C++ new/delete 极简笔记:动态内存管理核心用法
  • PyTorch-CUDA-v2.7镜像认证考试即将推出:检验技能水平
  • 如何在阿里云/AWS/GCP上运行PyTorch-CUDA-v2.7镜像?
  • 深圳HR专属年会活动方向全攻略:数据驱动+案例赋能,精准匹配不同团队需求
  • 社区版与企业版区别:功能、支持与SLA对比表
  • 从入门到精通:2024年C++高效编程的5个核心方法
  • 客户成功故事征集:分享你的PyTorch使用经历赢大奖
  • 牛逼了,未来 Linux 将运行在汽车平台上,2027年就可以实现!
  • 大模型学习路径:从入门到实践的循序渐进指南