共计 2039 个字符,预计需要花费 6 分钟才能阅读完成。
最近网上呈现一个美团面试题:“ 一个线程 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().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://blog.csdn.net/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 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!