采访者:哪些情况会产生OOM?怎么处理呢?

朋友在面试中遇到了这个面试问题。

什么时候会抛出OutOfMemery异常?乍一看,这似乎很简单。

实际上,深入研究整个JVM的理解,可以将这个问题变成Internet上的一些混乱答案。

实际上,总的来说,基本上可以总结出4种情况。

堆内存溢出堆内存溢出太常见了,大多数人应该可以想到这一点。

堆内存用于存储对象实例。

我们只需要继续创建对象,并确保GC根目录和对象之间存在可访问的路径,以避免垃圾回收。

,然后在对象数超过最大堆的大小限制后,可能会立即发生此异常。

编写一段代码对其进行测试,并将堆内存大小设置为2M。

公共类HeapOOM {公共静态void main(String [] args){Listlist = new ArrayList(); while(true){list.add(new HeapOOM());运行代码后不久,我可以看到OOM异常,这里的提示是Java堆空间溢出。

可以通过设置-XX:+ HeapDumpOnOutOfMemoryError来分析一般的故障排除方法,以在发生异常时转储当前的内存转储快照。

可以使用Eclipse Memory Analyzer(MAT)分析该分析,并且可以在官方网站上下载独立文件。

另外,如果使用的是IDEA,则可以使用商业版本的JProfiler或开源版本的JVM-Profiler。

此外,IDEA2018具有内置的分析工具,包括Flame Graph和Call Tree。

火焰图方法区域(运行时常量池)和元空间溢出方法区域与堆相同。

它是线程共享的区域,包括类文件信息,运行时常量池和常量池。

运行时常量池和常量池之间的主要区别是它是动态的,也就是说,不需要Class文件中常量池中的内容即可进入运行时常量池,并且还可以在运行时将新常量放入该池中。

,例如String的intern()方法。

让我们编写一段代码来验证String.intern(),同时我们设置-XX:MetaspaceSize = 50m -XX:MaxMetaspaceSize = 50m元空间大小。

由于我使用的是JDK的1.8版本,因此该方法区域存在于1.8版本之前的永久代(PermGen)中。

在1.8之后,永久生成的概念被取消,并转换为Metaspace。

如果是以前的版本,则可以将PermSize MaxPermSize设置为永久生成的大小。

private static String str =“ test”;公共静态无效main(String [] args){Listlist = new ArrayList(); while(true){字符串str2 = str + str.str.add(str.str)= str2; ());运行该代码,您将发现该代码报告一个错误。

再次修改配置,删除元空间限制,修改堆内存大小-Xms20m -Xmx20m,可以看到堆内存错误。

为什么是这样? intern()本身是一个本机方法,其功能是:如果字符串常量池已经包含等于此String对象的字符串,则它将返回表示池中字符串的String对象;否则,将包含此String对象。

将字符串添加到常量池中,并返回对该String对象的引用。

在1.7版之后,字符串常量池已转移到堆区域,因此将报告堆内存溢出错误。

如果版本低于1.7,则会看到PermGen空间错误。

直接内存溢出直接内存在运行时不是虚拟机数据区域的一部分,并且不受堆内存限制,但受机器内存大小限制。

例如,在NIO中,本机函数可用于直接分配堆外内存,这很容易导致OOM问题。

可以通过-XX:MaxDirectMemorySize指定直接内存大小,如果未指定,则默认值与Java堆最大值-Xmx相同。

直接内存导致的内存溢出的一个明显特征是,在转储文件中不会看到明显的异常。

如果在OOM之后发现转储文件非常小,并且在程序中直接或间接使用了NIO,则可以考虑对其进行检查。

是这个原因吗?堆栈内存溢出堆栈是线程专有的,并且其生命周期与线程的生命周期相同。

当执行每个方法时,将创建一个堆栈框架来存储信息,例如局部变量表,操作数堆栈,动态链接,方法出口等。

方法调用的过程是堆栈和弹出堆栈框架的过程。

在Java虚拟机规范中,为虚拟机堆栈定义了两个异常:如果线程请求的堆栈深度大于虚拟机允许的深度,则将引发StackOverflowError异常。

如果虚拟机堆栈可以动态扩展并且无法在扩展期间申请,则Eno

联系方式

双信电机以“材料工艺开发技术”、“电路设计技术”、“设备开发技术”为核心技术,开发各种滤波器、电容器等电子元器件,以电力电子事业、信息通信事业为中心,提供符合客户需求的定制产品。电子零件对于我们安心、安全地过上舒适的生活是不可缺少的,今后其作用也会变大。我们将继续提供符合时代需求和客户期望的高功能电子元件,为社会发展和人们的生活做出贡献。

查看详情

在线咨询