news 2026/8/9 9:05:46

堆溢出解决思路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
堆溢出解决思路

OOM:Java 堆溢出java.lang.OutOfMemoryError: Java heap space

现象:‑Xmx 设置的最大堆内存被占满,GC 反复回收,回收后内存依然不够,抛出堆溢出。

一、定位步骤(排查思路)

  1. 开启堆 dump,发生 OOM 自动导出堆快照
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/xxx/heap.hprof

程序 OOM 时自动生成 hprof 文件,用 MAT(Memory Analyzer Tool)(Eclipse 开源的内存分析工具,专门分析 hprof 堆转储快照文件,用来排查 Java 内存泄漏、堆 OOM)分析。

  1. MAT 分析 hprof 做三件事 ① 看大对象、支配树:是谁持有大量对象,是谁的引用链不让对象 GC。 ② 看对象数量:哪个类实例数量异常暴涨。 ③ 找泄漏点:对象本应该被回收,但被 GC Roots 强引用死死抱住。

区分两种完全不同情况:

  1. 内存泄漏(Memory Leak):对象不再业务使用,但存在强引用,无法 GC,内存只涨不降。
  2. 内存溢出(Memory Overflow):业务本身就需要这么多对象,内存给小了,没有泄漏。

二、情况 1:内存泄漏(最常见)

对象不用了,还被强引用持有,无法 GC。

常见泄漏场景

  1. 集合(List/Map)全局 static,只 add 不 remove,全局集合不断累积对象。
  2. ThreadLocal 没有 remove ();线程池线程复用,ThreadLocalMap 还持有对象引用。
  3. 监听器、回调注册,注销失败,引用没释放。
  4. 内部类持有外部类引用;匿名内部类捕获外部对象。
  5. 缓存没有设置淘汰策略(没有 LRU、过期时间),无限膨胀。

解决:

  • 不用的对象手动清除集合元素;
  • ThreadLocal 用完必须 remove;
  • 缓存增加最大容量、过期淘汰(Caffeine、Guava Cache);
  • 及时注销监听器回调;
  • 避免长生命周期对象持有短生命周期对象。

三、情况 2:没有泄漏,业务确实需要大量对象(堆内存配置过小)

例子:一次性查询百万数据全部加载进 List,全部放到内存。

MAT 看对象都是业务正常需要的,没有不该存活的对象。

解决思路二选一:

  1. 调高‑Xmx 堆内存,机器物理内存允许的前提下加大堆;
  2. 不要一次性全加载到内存,做流式处理 / 分页:分批读取、游标分页,不要把全量数据装入 List;使用迭代器逐条处理。

坑:select * from table查出几十万行封装进 List,直接打爆堆,属于业务写法问题,不是泄漏。

四、代码层面临时优化手段

  1. 大对象尽量方法内局部变量,方法执行结束,无其他引用就可以 GC;
  2. 大集合用完置为list=null,帮助 GC Roots 解除引用(更多是可读性,JVM 会自动识别);
  3. 避免在循环内疯狂 new 大量对象;循环内尽量复用对象,减少对象创建(看业务)。

五、GC 角度分析

观察 GC 日志:

-XX:+PrintGCDetails

如果看到:YGC 频繁,每次回收后可用内存很少;频繁 Full GC,内存几乎释放不下来 → 大概率内存泄漏。 如果一次性突增大量对象直接打满堆,回收效果尚可,只是瞬时需要内存大 → 业务数据量问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 9:04:41

大论文盲审前国内外研究现状综述的快速撰写与真实引文生成

大论文盲审前国内外研究现状综述的快速撰写与真实引文生成大论文定稿盲审阶段,除了核心的实验和结论,盲审专家最关注的往往就是第一章的“国内外研究现状综述”。如果文献综述空洞无物、逻辑混乱,或者因为使用大模型润色而踩中了“假引文”的…

作者头像 李华
网站建设 2026/8/9 9:00:23

知网AI疑似度超50%的修改方法与论文降AI快速通关教程

知网AI疑似度超50%的修改方法与论文降AI快速通关教程在大论文初稿查重或盲审返回报告后,很多毕业生看着报告单上高达 50% 甚至 60% 的知网 AIGC 疑似度(AI率)心惊肉跳。面对大面积的飘红,许多同学感到修改起来耗时费力&#xff0c…

作者头像 李华
网站建设 2026/8/9 9:00:19

终极指南:5分钟学会用qmcdump免费解锁QQ音乐加密文件

终极指南:5分钟学会用qmcdump免费解锁QQ音乐加密文件 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否…

作者头像 李华
网站建设 2026/8/9 8:55:42

性能测试与压力测试全解析:从概念到JMeter实战指南

1. 项目概述:从“压力测试”窥探性能世界的全貌刚入行做测试那会儿,听到“性能测试”和“压力测试”,总觉得它们是一回事,无非就是让系统多干点活,看看它会不会“累趴下”。后来踩过几次坑,比如在项目上线前…

作者头像 李华
网站建设 2026/8/9 8:53:44

数据编织实战:自动化治理异构数据存储,从概念到部署验证

这次我们来看一个数据编织项目,它瞄准的是企业里最头疼的问题:数据散落在各个角落,格式不一,管理混乱。数据编织不是简单的数据集成,而是一种架构理念,旨在通过自动化的方式,对异构的数据存储&a…

作者头像 李华
网站建设 2026/8/9 8:53:11

从77.8%到100%:SQLite FTS5与BM25排序优化实战

1. 项目概述:从“能用”到“精准”的排序优化之路做本地检索引擎,尤其是处理文档、知识库或者个人笔记这类场景,排序的准确性直接决定了产品的可用性。我最近就经历了一个典型的案例:一个基于SQLite FTS5和BM25的本地文档检索引擎…

作者头像 李华