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)

相关推荐

  • 一次基于windowsxp--SLmail服务的缓冲区溢出实践

    技术一次基于windowsxp--SLmail服务的缓冲区溢出实践 一次基于windows_xp--SLmail服务的缓冲区溢出实践一次基于windows_xp--SLmail服务的缓冲区溢出实践
    20

    礼包 2021年11月1日
  • 的确是什么意思,的确的“的”字几种读音是什么

    技术的确是什么意思,的确的“的”字几种读音是什么的,读音:de,dí,dì。[de]1、用在定语的后面的确是什么意思;2、用来造成没有中心词的“的”字结构;3、用在谓语动词后面,强调动作的施事者、时间、地点等;4、用在陈

    生活 2021年10月29日
  • 几何平均,什么是算术平均值和几何平均值

    技术几何平均,什么是算术平均值和几何平均值算术平均数(Arithmetic mean)是表征数据集中趋势的一个统计指标。 它是一组数据之和,除以这组数据之个/项数。算术平均数在统计学上的优点,就是它较中位数、众数更少受到

    生活 2021年10月20日
  • C++为什么要保持默认操作的一贯性

    技术C++为什么要保持默认操作的一贯性这篇文章主要介绍“C++为什么要保持默认操作的一贯性”,在日常操作中,相信很多人在C++为什么要保持默认操作的一贯性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望

    攻略 2021年11月29日
  • java环形队列如何控制循环时间(java并发如何判断阻塞队列已满)

    技术Java阻塞队列BlockingQueue怎么实现这篇文章主要讲解了“Java阻塞队列BlockingQueue怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“

    攻略 2021年12月21日
  • 凯撒密码对应表,古典密码安全算法有哪些

    技术凯撒密码对应表,古典密码安全算法有哪些世界上最早的一种密码产生于公元前两世纪。是由一位希腊人提出的凯撒密码对应表,人们称之为 棋盘密码,原因为该密码将26个字母放在5×5的方格里,i,j放在一个格子里,具体情
    况如

    生活 2021年10月25日