讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里什么是栈溢出_Java内存溢出原因说明

陌晨吖_4876

陌晨吖_4876

发布时间:2026-02-07 14:29:02

|

187人浏览过

|

来源于php中文网

原创

栈溢出是线程调用栈被撑爆,主因是调用过深或单次占栈过多;递归无终止条件会无限压栈直至超出默认约1MB栈上限,触发StackOverflowError,表现为同一方法在堆栈中反复出现。

在java里什么是栈溢出_java内存溢出原因说明

栈溢出就是线程调用栈被撑爆了,不是内存不够,而是“调用太深”或“单次占栈太多”——它和堆溢出(OutOfMemoryError)是两回事,不能靠加堆内存解决。

为什么递归会直接触发 StackOverflowError

每次方法调用都会在栈上压入一个帧(frame),存参数、局部变量、返回地址。递归没终止条件,或终止条件永远不满足,就会无限压栈,直到超出线程栈上限(默认通常 1MB 左右)。

  • 常见错误现象:Exception in thread "main" java.lang.StackOverflowError,堆栈跟踪里全是同一个方法反复出现
  • 典型场景:阶乘、斐波那契、树遍历等写成纯递归但没控制深度;或误把 if 写成 while 导致逻辑死递归
  • 容易踩的坑:以为“只是数据大”,其实问题在调用结构;比如 fibonacci(100) 不是算得慢,是根本跑不起来
  • 实操建议:
    – 加 if (n 这类明确出口,且确保每次递归都向出口靠近<br>– 深度超 1000 的递归,优先考虑改用迭代或尾递归(Java 8+ 不支持尾调用优化,别信“加 <code>@TailRec 就行”这种误导)

-Xss 参数能救急,但不该是首选

它调整的是每个线程的栈空间大小,比如 java -Xss2m MyApp 把栈从默认约 1MB 提到 2MB。但这只是“扩大容器”,不解决“往里塞太多”的本质问题。

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载
  • 参数差异:-Xss512k 太小,深度递归或 native 调用(如 SocketInputStream.read0)可能直接失败;-Xss4m 以上对多数应用偏奢侈,尤其高并发时线程数多,总栈内存开销剧增
  • 性能影响:栈变大 → 单线程更耐造,但线程总数可能被迫减少(OS 级限制或物理内存耗尽),反而降低吞吐
  • 容易踩的坑:在容器环境(如 Kubernetes)里盲目加大 -Xss,导致 Pod 因 RSS 超限被 OOMKilled;或者只改了开发机参数,上线后因环境差异又崩
  • 实操建议:
    – 先确认是不是真需要大栈:用 jstack <pid></pid> 看崩溃前最后几十帧是否真密集嵌套
    – 线上慎用,优先查代码;若必须调,建议从 1024k → 1536k 小步试,避免翻倍

不只是递归:局部变量和 native 调用也会压垮栈

很多人只盯着递归,却忽略一个方法里声明几十个大数组、或频繁调用 JNI 方法(如加密、图像处理),同样会快速吃光栈空间。

立即学习“Java免费学习笔记(深入)”;

  • 常见错误现象:非递归方法突然报 StackOverflowError;或只在特定 OS(如 Linux 64位)上出错,Windows 正常
  • 使用场景:ByteBuffer.allocateDirect() 虽然分配在堆外,但某些 native 实现会在栈上预分配缓冲区(例如 64KB);大量 String.substring() 在老 JDK 中也可能隐式引用大字符数组
  • 容易踩的坑:以为“没递归就安全”,结果在循环里不断 new 对象 + 调 native 方法,每轮都压栈;或在 Lambda 里闭包了大对象,间接增加栈帧体积
  • 实操建议:
    – 方法内避免声明超大局部数组(如 byte[] buf = new byte[1024 * 1024];),改用堆上分配 + 显式复用
    – 查 JNI 调用文档,确认其栈需求;必要时在 native 层做栈检查或切分任务
    – 用 jstack -l <pid></pid> 查锁信息时顺带看栈深度,比只看异常堆栈更早发现问题

真正难排查的栈溢出,往往藏在框架回调、代理类生成、甚至日志格式化里——它们让调用链变得不可见。与其事后调 -Xss,不如写完递归立刻画三笔调用图,确认最坏深度是否可控。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

354

2023.09.25

python如何计算数的阶乘
python如何计算数的阶乘

方法:1、使用循环;2、使用递归;3、使用math模块;4、使用reduce函数。更多详细python如何计算数的阶乘的内容,可以阅读下面的文章。

485

2023.11.13

python求阶乘教程大全
python求阶乘教程大全

本专题整合了python求阶乘相关教程,阅读专题下面的文章了解更多详细内容。

260

2025.11.08

python语言求阶乘
python语言求阶乘

本专题整合了python中阶乘相关教程,阅读专题下面的文章了解更多详细步骤。

407

2025.12.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6287

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2648

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6287

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2648

2023.08.10

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn