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)

相关推荐

  • yi的汉字,拼音“yi”都有哪些字

    技术yi的汉字,拼音“yi”都有哪些字一 乙 已 义 亿 弋 以 刈 忆 艺 失 仪 台 仡 议 伊 衣 圯 夷 钇 亦 屹 异 医 沂 诒 佁 矣 苡 佚 呓 役 抑 译 邑 依 祎 宜 怡 迤 饴 佾 峄 怿 易 绎

    生活 2021年10月28日
  • Java正则表达式中如何实现分组和替换

    技术Java正则表达式中如何实现分组和替换小编给大家分享一下Java正则表达式中如何实现分组和替换,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!正则表达式的子表达式(分组)不是很好懂,但却是很强大的文本

    攻略 2021年11月30日
  • python第三方模块

    技术python第三方模块 python第三方模块第三方模块
    第三方模块:并不是python自带的 需要基于网络下载下来'''pip所在的路径添加环境变量'''
    下载第三方模块的方式方式1:命令行借助

    礼包 2021年11月30日
  • 如何使用Cytoscape的NetworkAnalyzer工具计算网络相关属性

    技术如何使用Cytoscape的NetworkAnalyzer工具计算网络相关属性如何使用Cytoscape的NetworkAnalyzer工具计算网络相关属性,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编

    攻略 2021年11月10日
  • node中fs模块如何检测文件是否存在

    技术node中fs模块如何检测文件是否存在这篇文章主要介绍node中fs模块如何检测文件是否存在,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!检测方法:1、使用“const fs = requir

    攻略 2021年12月13日
  • 树莓派如何连接WPA2企业级802.1X保护WIFI

    技术树莓派如何连接WPA2企业级802.1X保护WIFI树莓派如何连接WPA2企业级802.1X保护WIFI,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。让

    攻略 2021年11月19日