StackOverFlowError 和 OutOfMemoryError 的区别

[复制链接]
发表于 2025-12-29 18:32:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
​StackOverflowError 和 OutOfMemoryError 都是 JVM 抛出的严峻错误,接下来我们简朴看一下他们的区别。
StackOverFlowError:栈内存不敷深(线程调用 栈深度 超出限定)。
OutOfMemoryError:目的内存地域不敷大(堆、方法区等共享内存地域 容量耗尽,无法为新对象分配富足空间)。
关于 JVM 的构成部门,各人可以看下这篇博文:JVM的构成部门。
一、StackOverFlowError:栈溢出
1、界说
当 单个线程的方法调用栈深度超出 JVM 答应的最大值 时,假造机栈无法再创建新的栈帧,触发此错误。
2、缘故原由

  • 方法调用链过长(如 无穷递归、深层递归);
  • 单个 栈帧过大(如方法内界说了超大的局部变量数组)。
3、场景

  • 最典范:无停止条件的递归调用(方法反复调用自身,栈帧连续叠加)。
  1. public class StackOverFlowTest {
  2.     // 递归调用,无终止条件
  3.     public static void recursiveCall() {
  4.         recursiveCall(); // 方法自身调用,栈帧不断入栈
  5.     }
  6.     public static void main(String[] args) {
  7.         recursiveCall();
  8.         // 运行结果:Exception in thread "main" java.lang.StackOverflowError
  9.     }
  10. }
复制代码

  • 深层 嵌套 调用(如 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 时,服务会处于 不稳固 状态,以致会自动关闭,此时,我们需实时排查缘故原由。
同为万里江湖客,共见三生风月身。-- 烟沙九洲
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表