Java内存溢出及解决:OutOfMemoryError 和 StackOverflowError

分析和解决java.lang.OutOfMemoryError: Java heap space问题 最近客户反馈在生产环境导入操作时遇到任务一直执行中,并且入库的数据量一直不改变。java.lang.OutOfMemoryError: Java heap space (JVM 堆空间溢出)简单来说就是在创建新的对象时, 堆内存中的空间不足以存放新创建的对象,导致此种问题的发生。 阅读详情

一、OutOfMemoryError 和 StackOverflowError

1️⃣堆区域用来存放 Class 的实例(即对象),对象需要存储的内容主要是非静态属性。每次用 new 创建一个对象实例后,对象实例存储在堆区域中,这部分空间也被 JVM 的垃圾回收机制管理。

【Java 堆内存溢出】java.lang.OutOfMemoryError:java heap space最常见,一般由于内存泄露或者堆的大小设置不当引起。原因是 JVM 创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与 Heap space 有关。解决这类问题有两种思路:

  1. 对于内存泄露,可以通过内存监控软件查找程序中的泄露代码。检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。
  2. 增加 JVM 中 Xms(初始堆大小)和 Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

2️⃣Java 栈跟大多数编程语言包括汇编语言的栈功能相似,主要基本类型变量以及方法的输入输出参数。

【Java 栈内存溢出】java.lang.StackOverflowError也比较常见。Java 栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。

二、Java 运行时数据区(Runtime Data Area)

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,即运行时数据区(Runtime Data Area):

  1. 【程序计数器】《Java虚拟机规范》中唯 一一个没有规定任何OutOfMemoryError情况的区域。
  2. 【Java虚拟机栈】《Java虚拟机规范》对该区域规定了两类异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError;如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError。
  3. 【本地方法栈】与虚拟机栈一样,也会在栈深度溢出或者栈扩展失败时分别抛出StackOverflowError和OutOfMemoryError。
  4. 【Java堆】既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩展来实现的通过参数-Xmx和-Xms设定。如果Java堆中没有内存完成实例分配,并且堆也无法再扩展时,Java虚拟机将会抛出OutOfMemoryError。
  5. 【方法区】《Java虚拟机规范》规定,如果方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError。

三、常见场景

1️⃣静态集合类声明为静态static的HashMap、Vector 等集合。通俗来讲A中有B,当前只把B设置为空,A没有设置为空,回收时B无法被回收,因为被A引用。
2️⃣物理连接:DataSource.getConnection()建立链接,必须通过close()关闭链接。
3️⃣内部类和外部模块等的引用
GC只会回收没有被引用或者根集不可到达的对象(取决于 GC 算法),内部类在生命周期内始终持有外部类的对象的引用,造成外部类的对象始终不满足 GC 的回收条件,反映在内存上就是内存泄露。常见解决方案:

  1. 将内部类定义为static
  2. 用static的变量引用匿名内部类的实例或将匿名内部类的实例化操作放到外部类的静态方法中

4️⃣【OutOfMemoryError:unable to create new native thread】Executors 返回的线程池对象的弊端如下:

  1. FixedThreadPool 和 SingleThreadPool:
    允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
  2. CachedThreadPool 和 ScheduledThreadPool:
    允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。

四、分析定位

1️⃣在未明确找到问题原因前,先添配置 JVM 启动参数,监控复原 OOM 场景自动dump:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${目录}

2️⃣

  1. 获取内存的堆信息jmap -dump:format=b,file=mem.dat pid
  2. 使用内存映像分析工具(如Eclipse Memory Analyzer)对 dump 出来的堆转存快照进行分析,重点是确认内存中的对象是否是必要的,先分清是因为内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。
  3. 看分析图,查找对应问题,分析内存占用情况。例如:localstore 存储问题分析,大对象。
fastjson2序列化报错OutOfMemoryError 报错如下,这里用的是阿里的com.alibaba.fastjson2,该版限制了最大可以大小是64M,超过了就报错OutOfMemoryError。 阅读详情

相关推荐

Java中的OutOfMemoryError(OOM)

OutOfMemoryError(OOM)是Java虚拟机(JVM)在无法分配足够内存时抛出的严重错误,通常导致应用程序崩溃。OOM与系统级内存不足不同,主要影响单个JVM进程,可通过JVM参数调整。常见的OOM类型包括Java堆OOM、元空间OOM、直接内存OOM等,每种类型对应不同的内存区域和触发条件。OOM的根本原因可能包括内存泄漏、内存溢出、JVM配置不当或外部因素。诊断OOM时,可以使用命令行工具(如jps、jstat、jmap)或图形化工具(如JConsole、VisualVM)进行分析,并通过

记录学习的过程 1822

OutOfMemoryError系列(1): Java heap space

这是本系列的第一篇文章, 相关文章列表: OutOfMemoryError系列(1): Java heap space OutOfMemoryError系列(2): GC overhead limit exceeded OutOfMemoryError系列(3): Permgen space OutOfMemoryError系列(4...

weixin_34066347的博客 1626

JDK 7到JDK17的JVM调优:调整JVM内存配置解决内存溢出(‌OutOfMemoryError: Java heap space)‌或栈溢出(‌StackOverflowError)‌等错误

‌例如,‌可以将最小堆内存设置为2GB(‌-Xms2048m)‌,‌最大堆内存设置为4GB(‌-Xmx4096m)‌。解决方案:根据服务具体的部署(启动)方式,通过调整JVM的默认内存配置来解决内存溢出(‌OutOfMemoryError)‌或栈溢出(‌StackOverflowError)‌等错误。原因分析:查询查询平台所有船舶的统计数据,接口输出的数据量达到153M,在Spring框架中处理HTTP请求的时候,调度请求给相应的处理器(Handler)偶尔会发生内存溢出。

专注于计算机研发知识和资讯分享 878

java.lang.OutOfMemoryError: Java heap space

主要有3种比较常见的OutOfMemory Error: Java.lang.OutOfMemoryError: Java heap space java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: GC overhead limit exceeded

daxiong0816的博客 8万+

大模型运维实战:从GPU选型到推理服务稳定落地

大模型服务进入生产环境后,运维对象从传统进程转向GPU显存、KV Cache、推理吞吐等动态资源。显存利用率、首token延迟、并发队列深度等指标,直接影响模型服务的质量与成本。理解推理框架的内存分配机制、掌握监控告警与自动化扩容手段,是保障服务稳定的关键。这类能力广泛应用于企业私有化部署、智能客服、知识库问答等场景,帮助运维团队从被动救火转向主动容量规划与性能调优。本文围绕大模型运维的完整路线,梳理从硬件选型、推理部署到监控排障的实战经验,并算清一份真实项目的长期成本账。

weixin_29054245的博客 236

【论文精读】Latent Diffusion

Latent Diffusion

weixin_44934783的博客 4473

【JVM】OutOfMemoryError与StackOverflowError

一、虚拟机和本地方法Java栈溢出 StackOverflowError: 如果线程请求的栈深度大于虚拟机所允许的最大深度,会抛出StackOverFlow异常(比如递归的时候不写出口) //单线程状态下 public class Test2 { private int length = 1; public void testLength(){ length++; ...

学习笔记。 315

【计算机视觉40例】案例08:石头剪刀布手势识别

计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。......

计算机视觉之光 2155

调优JVM内存,并解决OutOfMemoryError,StackOverflowError等异常问题

调优JVM内存,并解决OutOfMemoryError,StackOverflowError等异常问题 博客分类:  Java JVMJavaEclipseSUNExcel  JVM 调优,首先应从内 存开始,尤其是在真正的的web服务部署的时候。因为真正的web服务会比开发的时候花费更多的内 存,用来处理多用户并发的情况。本人多次吃过这方面的亏,所以整理一下,希望能给

AresGod的专栏 1286

从时序迷宫到稳定通信:FSMC配置中的时间参数深度解析与实战避坑指南

本文深入解析STM32 FSMC配置中的时间参数,特别是AddressSetupTime和DataSetupTime的实战配置技巧。通过STM32F407连接SRAM的实际案例,提供从理论计算到CubeMX配置的全流程指南,帮助开发者避免常见时序陷阱,确保稳定通信。

nginx7reverse的博客 81

红米k60 修复“NV损坏” 去除主板校验电阻步骤解析与图示

红米k60 基带代码:mondrian。搭载‌高通骁龙8+ Gen1处理器.国外版本称:POCO F5 Pro适用于以下型号的小米机型:23013RK75C, 23013PC75G。 💝💝💝通过博文了解 1💝💝💝-----此机型修复NV损坏硬件类操作主板图示 2💝💝💝-----了解设备出现NV损坏的底层逻辑 3💝💝💝 ------具体修改步骤

小马哥的专栏 391

什么情况下会发生堆内存溢出,栈内存溢出,结合实例说明

转载自:https://blog.youkuaiyun.com/qq_31615049/article/details/82980799 一、 栈溢出(StackOverflowError) 栈是线程私有的,他的生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口灯信息。局部变量表又包含基本数据类型,对象引用类型(局部变量表编译器完成,运行期间不会变化) 所以我们可以理解为栈溢出就是方法执行是创建的栈帧请求的深度超过了栈能给予的最大深度。 最有可能的就是: 方法

Daryl的博客 2153

Codex 自定义模型操作指南:CLI 与桌面客户端双端实操

检查版本 codex --version # 预期输出类似:codex-cli 0.133.0-alpha.1 # 如未安装 npm install -g @openai/codex假设你要接入DeepSeek,在# 临时设置(当前终端会话有效)export DEEPSEEK_API_KEY="sk-你的 DeepSeek API Key"# 永久设置(推荐,写入 shell 配置)

篮球界最会写bug的人;程序猿中打球最菜的人。 452

JVM内存溢出异常OOM

栈溢出 StackOverflowError Java 里的 StackOverflowError。抛出这个错误表明应用程序因为深递归导致栈被耗尽了。每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态;当线程调用一个方法是,jvm压入一个新的栈帧到这个线程的栈中,只要这个方法还没返回,这个栈帧就存在。 如果方法的嵌套调用层次太多(如递...

昕友软件博客 457

UE5实现建筑剖切效果

UE5实现建筑剖切效果

专注GIS开发 8458

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

java内存溢出

转自:微点阅读 https://www.weidianyuedu.com java程序员在面试经常被问到内存om之后如何处理,但是实际在工作中遇到此类问题的情况却又非常少。 进过自己一番总结内存溢出主要分为2种: 一、堆内存溢出 OutOfMemoryError 从jvm的角度看发生的情况是: 1、动态扩展的栈内存无法满足内存分配。 2、建立新的线程没有足够内存创建栈。 从编码角度看发生的情况是: 1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2、集合类中有对对象的...

ysds20211402的博客 94

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OutOfMemoryError内存溢出和StackOverFlowError栈溢出及解决方法

线程的堆栈存储 线程局部原始数据类型、变量、对象的引用、返回值。如果线程堆栈大小超出分配的内存限制,就会出现栈溢出错误。内存溢出指堆上存储的东西大于分配的内存大小。堆上存放数组、对象等数据。64位电脑默认栈大小为 1024k=1m。可以修改为-Xss2m。我这里整体配置的是 1024m,可以修改-Xmx=2048m。这里用递归调演示错误。这里用数组演示错误。

Misszhoudandan的博客 585

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JVM内存溢出分析:堆内存溢出+虚拟机

Exception in thread “Thread-0” java.lang.StackOverflowError 的异常。 (2)OutOfMemoryError:如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出 OutOfMemoryError。 我们可以这样理解,虚拟机中可以供栈占用的空间≈可用物理内存 - 最大堆内存 - 最大方法区内存,比如一台机器内存为 4G,系统和其他应用占用 2G,虚拟机可用的物理内存为 2G,最大堆内存为 1G,最大方法区内存为 512M,那可供栈占有的内存大约.

m0_69379068的博客 305

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java内存溢出的2种情况

java程序员在面试经常被问到内存om之后如何处理,但是实际在工作中遇到此类问题的情况却又非常少。 进过自己一番总结内存溢出主要分为2种: 一、堆内存溢出 OutOfMemoryError 从jvm的角度看发生的情况是:1、动态扩展的栈内存无法满足内存分配。 2、建立新的线程没有足够内存创建栈。 从编码角度看发生的情况是: 1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据; ...

u012599432的博客 1389

JVM基础知识---Java内存溢出OOM

Java内存溢出OOM一. 经典错误二. 架构三. StackoverFlowError四. OutOfMemoryError①. java heap space②. GC overhead limit exceeded③. Direct buffer memory④. unable to create new native thread⑤. Metaspace 一. 经典错误 JVM中常见的两个错误 StackoverFlowError :栈溢出 OutofMemoryError:

491

内存溢出

1、栈内存溢出java.lang.StackOverflowError2、内存溢出oomjava.lang.OutOfMemoryError:Java heap space 异常说明java虚拟机占内存不够,原因有二:(1)java虚拟机的堆内存设置不够,可以通过参数-Xms、-Xmx来调整(2)代码中创建了大量大对象,并且很长时间不能被垃圾收集器收集(存在被引用)。3、(不常见,现在几乎没有)如...

ViJayThresh的博客 241

Java 产生内存溢出的几种情况

StackOverFlowError 解释:线程栈内存溢出, 原因:方法递归调用 OutOfMemoryError:Java heap memory 解释:堆内存溢出 原因:大量对象创建撑爆堆区 OutOfMemoryError:GC overhead limit exceeded 解释:频繁GC且GC无效果 原因:大量对象创建且无法回收,GC时间占用超过98%并且回收了不到2%的内存 OutOfMemoryError:Direct buffer memory 解释:直接内存溢出 原因:写NIO程序时经常会

weixin_41618956的博客 1087

jvm的内存溢出异常

1.jvm的内部体系结构浅析       2.jvm的几个运行时数据区域       3.jvm的内存溢出异常     在Java虚拟机规范的描述中,除了PC(程序计数器)寄存器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError异常的可能。当发生OutOfMemoryError异常时,无法用try...catch捕捉。     在开始讲解之前,在这里先简单介绍下虚拟

Mydwr的专栏 821
上一篇: Java 内存模型(Java Memory Model)
下一篇: Oracle 生成多位不重复的纯数字序列(Sequence)
JFS_Study
博客等级 码龄6年 363粉丝 359原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值