• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

java 搞代码 4年前 (2022-01-28) 25次浏览 已收录 0个评论

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于java:美团面试题一个线程-OOM-后其他线程还能运行吗

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址