双信 SOSHIN · 产品与技术资料捷比信主站 · 综合产品与服务
双信 SOSHIN滤波器、电容与磁性元件
捷比信产品咨询0755-29796190

采访者:哪些情况会产生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。

相关资料

华为计划推出新的Nova 7系列手机NVIDIA停产的RTX 2070 Super突然复活了!Vivo于1月30日推出X60 Pro +超大杯,全渠道销售上汽大众首款新电动车ID.4 X开始预售Galaxy Microtrans积极构建智能物流的新生态[ZYNQ Ultrascale + MPSOC FPGA教程]第30章自定义IP实验华为手机芯片库存可持续多久?郭平说:还在寻找办法意法半导体发布BlueNRG-2N网络处理器,该处理器集成了便利性,可扩展性,Bluetooth®5.0功能和安全性美国的欺凌方法屡屡发生变化:TikTok事件已成为魔鬼的镜子智能家居系统中的传感器是什么?新的Redmi K40将配备高通Snapdragon 888大众准备在4年内投资150亿欧元并推出15款新能源汽车英特尔图形驱动程序正式支持DG1独立显示荣耀第一次新闻发布会回应了与供应链公司恢复合作的消息台积电的芯片研发处于领先地位,半导体工艺芯片蚀刻起着重要作用三星Galaxy Tab M62平板电脑芯片和基准曝光荣耀手表GS Pro神秘天空版发布2021MWC上海展览会将展示世界上第一个“ 5G创新区”。OPPO智能手环有望很快登陆全球市场为在Android智能手机上实时播放的视频添加字幕