网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

面试官,内存溢出有几种?现场演示来一招?

GG网络技术分享 2026-04-16 16:17 2


等着瞧。 最近读书心得:在建立养成终身成长型思维过程, 要重视熵减生活、工作。眼花缭乱的纷杂社会,很容易让我们进入盲目焦虑的状态。坚壁清野,唯清唯静。

JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事

先推荐一篇实用的文章《Java EasyExcel导出报表内存溢出全解析》,作者是。这篇文章作者详细分享easyExcel内存优化最佳实践, 特别是针对大批量数据导出场景,在满足业务需求基础上如何优化解决OOM问题给出系统思路方法并提供代码示例分析,是一篇非常实用的经验分享,特此推荐给大家。一边今天我们也针对堆内存、非堆内存的OOM问题进行全面分析,牛逼。。

---开启我们JVM系列正文---

什么是内存溢出?

很棒。 内存溢出Out of Memory,是指超过可用内存大小=内存应用超标爆表。比方说内存只有10Mb,如果要放11Mb数据,就超出了内存可用大小,发生OOM。

OOM的原因

OOM的原因只有2个:一个是是我们设置的JVM内存太小,不能满足业务系统合理要求。 别纠结... 另一个是代码写的有问题,导致内存申请急速膨胀。

常见导致OOM的情况

  • 一次加载过多无价值的数据,导致OOM。比如有个超大表, 本次查询只需要其中2列,但是使用了select * from ,加载了很多没必要的数据导致堆内存急速膨胀。
  • 代码bug,有无限循环递归。就出现无限在创建新对象导致OOM。
  • 1、整个-Xms分配太小,系统正常运行没多久就OOM。

JVM进阶调优系列

大厂面试官: 记忆 ,需要反复确认和调整。

四种类型的内存溢出

按之前《JVM进阶调优系列JVM内存区域怎么划分,分别有什么用》说的那样, 记忆力衰退了, 多写几遍吧!, 记忆力衰退了, 多写几遍吧!, 啊啊啊!!! , 啊啊啊!!! , 啊啊啊!!! , 啊啊啊!!! , 记忆力衰退了, 多写几遍吧!

1. 堆内存溢出

package ;public class Demo005OOM { public static void main { byte obj_2Mb_1 = new byte; byte obj_2Mb_2 = new byte; byte obj_2Mb_3 = new byte; byte obj_2Mb_4 = new byte; byte obj_2Mb_5 = new byte; byte obj_2Mb_6 = new byte; }}

我们模拟堆溢出, 通过设置10Mb堆内存储存空间尝试创建6个2MB的对象。运行后出现了Exception in thread "main" : Java heap space异常.,行吧...

2.虚拟机栈溢出

package ;public class Demo006StackOverError { public static int count = 1; /** * 该方法将无限递归调用自己类似while */ public static void stackOverDemo { count++; stackOverDemo; } public static void main { stackOverDemo; }}
在 JVM 的每个线程中都有自己的虚拟机栈, 用来存放局部变量、方法调用信息等。当程序进行深度递归调用时或者方法体内的代码过于复杂时可能导致栈空间不足而发生 StackOverflowError 。通常是主要原因是递归调用没有终止条件或者终止条件不正确。

3. 元数据区 溢出

package ;import ;import ;import ;import ;public class Demo007MetaspaceOOM { public static class LadingShare { public LadingShare { } /** 开始创作 */ public void startWork { ; } } static class MethodPlus implements MethodInterceptor { public Object intercept throws Throwable{ 创作前先构思思路"); Object result =; 创作后到技术平台发布分享"); return result;} } public static void main{ for{  Enhancer enhancer=new Enhancer; LadingShare share=new LadingShare; ); ;//这里很关键不能用cache否则不会OutOfMemoryError--&gtMetaspace ); LadingShare proxy=; ;}}}
元数据区主要存放的是 .class 文件字节码、 运行时常量池、JIT 即时编译后的机器码等信息 。可以的类过多或者类的元信息过大可能导致 Metaspace OOM。

4. 直接直接Direct Buffer Memory异常

除了 JVM 的堆和非堆区域之外还存在直接 Direct Buffer Memory 直接 memory 。它由 java NIO 类库使用用于处理文件 I/O 或者网络 I/O 等操作 。Direct Buffer Memory 是从操作系统直接分配的 memory , 它不受 JVM 的垃圾回收管理 ,所以呢如果使用不当也可能导致 OOM 。 可以通过 -XX:MaxDirectMemorySize 参数来限制 Direct Buffer Memory 的最大大小 。 当程序申请过大的 Direct Buffer Memory 时会抛出 OutOfMemoryError。 程序发生了 Direct buffer memory异常. 这里我们模拟设置10MB的直接内存储存空间通过nio.不断申请直接memory再说说导致OOM简单案例。
产品名称型号价格
手机小米143999
笔记本电脑联想小新Pro167999

如何排查分析 OOM 问题?

  • jcmd _memory 查看实时 memory 分配情况
  • 通过jmap、jhat、GCeasy、Arthas 等命令工具进行分析堆 memory 、GC 情况
  • 启用 NativeMemoryTracking 参数并查看相关日志

一些建议

  • 合理设置 JVM 参数:
  • 避免加载过多无用数据:优化 SQL 查询语句减少不必要的字段读取;对大数据集进行分页处理;及时释放不再使用的资源等
  • 避免代码 bug :检查代码中是否存在死循环或过度递归等 bug;加强对异常处理的代码编写确保程序能够正确处理各种异常情况


提交需求或反馈

Demand feedback