关于java:美团面试题一个线程-OOM-后其他线程还能运行吗

最近网上呈现一个美团面试题:“一个线程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开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理