OOM与StackOverFlow发生的原因及解决办法【待完成】
1,Out Of Memery 内存耗尽
1,1 产生原因
1.1.1 内存用完【堆内存】
package com.cnblogs.mufasa; import org.junit.Test; import java.util.ArrayList; public class Model { @Test public void test(){ ArrayList<Integer> arr=new ArrayList<>(); while (true){ arr.add(1); } } } /* java.lang.OutOfMemoryError: Java heap space */
1.1.2 没有退出的递归调用
- 如果我们写一段程序不断的进行递归调用,而且没有退出条件,就会导致不断地进行压栈。类似这种情况,JVM 实际会抛出 StackOverFlowError;当然,如果 JVM 试图去扩展栈空间的的时候失败,则会抛出 OutOfMemoryError。
- 对于老版本的 Oracle JDK,因为永久代的大小是有限的,并且 JVM 对永久代垃圾回收(如,常量池回收、卸载不再需要的类型)非常不积极,所以当我们不断添加新类型的时候,永久代出现 OutOfMemoryError 也非常多见,尤其是在运行时存在大量动态类型生成的场合;类似 Intern 字符串缓存占用太多空间,也会导致 OOM 问题。对应的异常信息,会标记出来和永久代相关:“java.lang.OutOfMemoryError: PermGen space”。
- 随着元数据区的引入,方法区内存已经不再那么窘迫,所以相应的 OOM 有所改观,出现 OOM,异常信息则变成了:“java.lang.OutOfMemoryError: Metaspace”。
1,2 如何解决
1,3 注意事项
2,Stack Over Flow 堆栈溢出
2,1 产生原因
package com.cnblogs.mufasa.SOF; import org.junit.Test; public class SOF_validate1 { public void recursive(){ int cnt=0; StringBuilder sb=new StringBuilder(); while (cnt<1){ sb.append(new String(""+cnt)); cnt++; } recursive(); } @Test public void test(){ recursive();//没有退出条件的递归 } } /* java.lang.StackOverflowError */
2,2 如何解决
2,3 注意事项
探究未知是最大乐趣
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人