最近网上呈现一个美团面试题:“一个线程OOM后,其余线程还能运行吗?”。
我看网上呈现了很多不靠谱的答案。这道题其实很有难度,波及的知识点有jvm内存调配、作用域、gc等,不是简略的是与否的问题。
因为题目中给出的OOM,java中OOM又分很多类型;比方:堆溢出(“java.lang.OutOfMemoryError: Java heap space”)、永恒带溢出(“java.lang.OutOfMemoryError:Permgen space”)、不能创立线程(“java.lang.OutOfMemoryError:Unable to create new native thread”)等很多种状况。
本文次要是剖析堆溢出对利用带来的影响。
先说一下答案,答案是还能运行。
代码如下:
public class JvmThread { public static void main(String[] args) { new Thread(() -> { List<byte[]> list = new ArrayList<byte[]>(); while (true) { System.out.println(new Date().toString() + Thread.currentThread() + "=="); byte[] b = new byte[1024 * 1024 * 1]; list.add(b); try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } }).start(); // 线程二 new Thread(() -> { while (true) { System.out.println(new Date<a style="color:transparent">来源gao*daima.com搞@代#码网</a>().toString() + Thread.currentThread() + "=="); try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }
后果展现:
Wed Nov 07 14:42:18 CST 2018Thread[Thread-1,5,main]== Wed Nov 07 14:42:18 CST 2018Thread[Thread-0,5,main]== Wed Nov 07 14:42:19 CST 2018Thread[Thread-1,5,main]== Wed Nov 07 14:42:19 CST 2018Thread[Thread-0,5,main]== Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space at com.gosaint.util.JvmThread.lambda$main$0(JvmThread.java:21) at com.gosaint.util.JvmThread$$Lambda$1/521645586.run(Unknown Source) at java.lang.Thread.run(Thread.java:748) Wed Nov 07 14:42:20 CST 2018Thread[Thread-1,5,main]== Wed Nov 07 14:42:21 CST 2018Thread[Thread-1,5,main]== Wed Nov 07 14:42:22 CST 2018Thread[Thread-1,5,main]==
JVM启动参数设置:
上图是JVM堆空间的变动。咱们仔细观察一下在14:42:05~14:42:25之间曲线变动,你会发现应用堆的数量,忽然间急剧下滑!这代表这一点,当一个线程抛出OOM异样后,它所占据的内存资源会全副被开释掉,从而不会影响其余线程的运行!
讲到这里大家应该懂了,此题的答案为一个线程溢出后,过程里的其余线程还能照常运行。留神了,这个例子我只演示了堆溢出的状况。如果是栈溢出,论断也是一样的,大家可自行通过代码测试。
总结:其实产生OOM的线程个别状况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,开释内存。因为产生OOM之前要进行gc,就算其余线程可能失常工作,也会因为频繁gc产生较大的影响。
最初,关注公众号Java技术栈,在后盾回复:面试,能够获取我整顿的 Java、JVM 系列面试题和答案,十分齐全。
原文链接:https://www.gaodaima.com/gosaint…
版权申明:本文为CSDN博主「大佛拈花」的原创文章,遵循CC 4.0 BY-SA版权协定,转载请附上原文出处链接及本申明。
近期热文举荐:
1.600+ 道 Java面试题及答案整顿(2021最新版)
2.终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!
3.阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!
5.《Java开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!