JVM堆内存溢出后其他线程是否可继续工作

技术JVM堆内存溢出后其他线程是否可继续工作本篇文章给大家分享的是有关JVM堆内存溢出后其他线程是否可继续工作,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

本文讨论的是在JVM堆内存溢出后,其他线程是否可以继续工作。边肖觉得挺实用的,所以想分享给大家学习。希望你看完这篇文章能有所收获。话不多说,让我们和边肖一起看看。

JVM堆内存溢出后其他线程是否可继续工作

最近网上出现了美团的一个采访问题:“一个线程OOM之后还能有其他线程运行吗?”。我看到网上有很多不靠谱的答案。这个问题其实很难。涉及的知识点包括jvm内存分配、作用域、gc等。这不是一个简单的是否。

由于标题中给出的OOM,java中有许多类型的OOM。例如:

堆溢出(“java.lang.out of memory错误: java堆空间”);

永久溢出(“Java . lang . out of memory error : perm gen space”);

无法创建线程(“Java . lang . out of memory error :无法创建新的本机线程”),等等。

主要分析堆溢出对应用的影响。

我先说说答案。答案是它还能跑。

代码如下

public classjvmthread { publicationstativitmain(String[]args){ Newthread(()-{ Listbyte[]list=NewArraylistbyte[]();while(true){ system . out . println(new date()。toString(). thread . currentthread()'==');byte[]b=new byte[1024 * 1024 * 1];list . add(b);尝试{ thread . sleep(1000);} catch(Exception one){ e . printstacktrace();}}n

bsp;    }).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">  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堆内存溢出后其他线程是否可继续工作

上图是JVM堆空间的变化。我们仔细观察一下在14:42:05~14:42:25之间曲线变化,你会发现使用堆的数量,突然间急剧下滑!这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行!

讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。注意了,这个例子我只演示了堆溢出的情况。如果是栈溢出,结论也是一样的,大家可自行通过代码测试。

总结

其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存。因为发生OOM之前要进行gc,就算其他线程能够正常工作,也会因为频繁gc产生较大的影响。

以上就是JVM堆内存溢出后其他线程是否可继续工作,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/44221.html

(0)

相关推荐

  • ORACLE中出现ORA-28365错误怎么办

    技术ORACLE中出现ORA-28365错误怎么办这篇文章主要为大家展示了“ORACLE中出现ORA-28365错误怎么办”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ORA

    攻略 2021年11月20日
  • VSCode的使用技巧有哪些

    技术VSCode的使用技巧有哪些本篇内容主要讲解“VSCode的使用技巧有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“VSCode的使用技巧有哪些”吧!1. 查看日志步

    攻略 2021年10月27日
  • Tomcat是如何处理请求参数的

    技术Tomcat是如何处理请求参数的Tomcat是如何处理请求参数的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。url请求中带参数的形式(即我们常说的GE

    攻略 2021年12月8日
  • 十大经典排序算法

    技术十大经典排序算法 十大经典排序算法本文转载自https://www.cnblogs.com/onepixel/articles/7674659.html
    0、算法概述
    0.1 算法分类
    十种常见排序

    礼包 2021年12月14日
  • docx文件,Docx文件怎么打开呢

    技术docx文件,Docx文件怎么打开呢方法一docx文件、安装补丁法如果你的电脑中只安装了Word2003,而有一个文档却是2007或以上的那么要打开的办法你可以到微软件的网站下载补丁,或点击Word2007兼容补丁下

    生活 2021年10月31日
  • C++11:std::tuple

    技术C++11:std::tuple C++11:std::tuple翻译来自:https://thispointer.com/c11-stdtuple-tutorial-examples/
    在本文中,

    礼包 2021年11月23日