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)

相关推荐

  • 如何以Windows Service的方式运行Python程序

    技术如何以Windows Service的方式运行Python程序这期内容当中小编将会给大家带来有关如何以Windows Service的方式运行Python程序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文

    攻略 2021年11月2日
  • 怎么理解Redis中的分布式锁

    技术怎么理解Redis中的分布式锁本篇内容介绍了“怎么理解Redis中的分布式锁”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有

    攻略 2021年10月26日
  • 怎样在Vue中使用JSX

    技术怎样在Vue中使用JSX怎样在Vue中使用JSX,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JSX是什么JSX 是一种 Javascript 的语法扩

    攻略 2021年10月21日
  • 黑眼圈,快速去除黑眼圈的好方法有哪些

    技术黑眼圈,快速去除黑眼圈的好方法有哪些黑眼圈的形成原因比较复杂,总体可以按照成因分为以下2类黑眼圈:1、色素沉积型:一般为茶褐色,多由于日晒、不恰当的化妆和卸妆等导致的皮肤色素沉着。解决对策上应以减少色素沉积、促进黑色

    生活 2021年10月20日
  • 箭头符号怎么打,电脑常识:往返双箭头符号怎么打

    技术箭头符号怎么打,电脑常识:往返双箭头符号怎么打输入往返双箭头符号的方法如下箭头符号怎么打: 1.打开WPS表格这款软件(其他office软件也可以),进入WPS表格的操作界面: 2.在该界面内找到,插入选项: 3.点

    生活 2021年10月26日
  • MySQL中如何使用undrop来恢复drop的表

    技术MySQL中如何使用undrop来恢复drop的表小编给大家分享一下MySQL中如何使用undrop来恢复drop的表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下

    攻略 2021年11月2日