java面试oom问题及答案_java面试中必问的oom问题

f3b000c56ccaae9c8acaa2f7724dae3b.png

引言

一般你去面试的时候,面试官经常会问:请谈谈你对OOM的认识?然后,你可能会说OOM就是out of memory,那如果你只是这么答的话,这可不是面试官想要的答案;面试官又接着问,那你生产过程中有遇到哪些OOM呢?请你说说出常见的OOM问题?这时的你可能是懵的。先来做个调查,你知道几种常见的OOM呢?欢迎评论区留言。

总览

来看一下思维导图,这些错误的异常你有遇到过吗?

b04e384cb2d113cf4ea4dbc4bba98b41.png

常见的OOM

1. StackOverflowError

线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常 。递归调用方法,如果没有方法出口的方法会造成StackOverflowError,或者说如果调用的过深都会抛出,这种错误也比较容易定位。

9902601a891df1c576b7a21ee07b0066.png

2. java.lang.OutOfMemoryError: Java heap space

溢出原因:深入理解Java虚拟机书中讲到java堆溢出,Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。

3. java.lang.OutOfMemoryError:GC overhead limit exceeded

GC回收时间长时会抛出OutOfMemoryError。过长的定义是,超过98%的时间用来做GC并且回收了不到2%的堆内存,连续多次GC都只回收了不到2%的极端情况下才会抛出。假设不抛出GC overhead limit错误会发生什么情况呢?那就是GC清理的这么点内存很快会再次填满,迫使GC再次执行,这样就形成恶性循环,CPU使用率一直是100%,而GC缺没有任何成果。

4. java.lang.OutOfMemoryError:Direct buffer memory

Direct memory可以通过参数-XX:MaxDirectMemorySize设定本机直接内存可用大小,如果不指定,则默认与java堆内存大小相同。过使用-XX:MaxDirectMemorySize=5M,限制最大可使用的本机直接内存大小为5MB,如果超过将抛出异常。

5. java.lang.OutOfMemoryError:unable to create new native thread

不知道你们生产环境是否会出现这种情况,高并发请求服务器时,经常出现如下异常java.lang.OutOfMemoryError:unable to create new native thread。那出现的原因呢?

1.创建太多的线程了2.服务器的设置限制了你创建线程的数量了6. java.langOutOfMemoryError:Metaspace

我们知道Java8及以后已经使用Metaspace来替代永久代,Metaspace并不在虚拟机内存中而是使用本地内存。主要还是是加载到内存中的 class 数量太多或者体积太大。这时可以通过JVM参数-XX:MaxMetaspaceSize指定。

总结

不知道你们是否学会了呢?现在面试要求越来越高,面试的时候对JVM考察的也越来越多,尤其是jvm的一些异常和调优这块是高频面试题,所以是时候开始Java虚拟机了。

想了解更多请关注我吧!关注我然后私信我可以获取【深入理解Java虚拟机】网盘地址

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值