乐趣区

关于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 开发手册(嵩山版)》最新公布,速速下载!

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

退出移动版