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)

相关推荐

  • 怎么用OBS和WebSockets播放视频流

    技术怎么用OBS和WebSockets播放视频流这篇文章主要为大家展示了“怎么用OBS和WebSockets播放视频流”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用OB

    攻略 2021年10月26日
  • Python代码格式化工具pycodestyle怎么使用

    技术Python代码格式化工具pycodestyle怎么使用本篇内容介绍了“Python代码格式化工具pycodestyle怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学

    攻略 2021年11月29日
  • 格力空调e6,格力空调显示E6是什么故障

    技术格力空调e6,格力空调显示E6是什么故障格力空调显示E6原因分析格力空调e6:1、通信故障。说明空调是变频的,需要检查一下与室外机的黑色连线部分是否有松脱,没有的话,就需要打人工,让他们安排售后来检查一下。
    2、内机

    生活 2021年10月23日
  • 如何添加Lombok支持和使用Thymeleaf

    技术如何添加Lombok支持和使用Thymeleaf本篇文章给大家分享的是有关如何添加Lombok支持和使用Thymeleaf,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小

    攻略 2021年11月9日
  • 年龄差距大的夫妻,夫妻年龄差大六岁不好吗

    技术年龄差距大的夫妻,夫妻年龄差大六岁不好吗夫妻年龄相差「很大」,可能为婚姻带来严重的问题。如果你和伴侣相差四、五岁,差别不会太大,如果相差十岁以上,就会造成很多困难。例如耐心上,年长的通常会对年轻的一方感到不耐烦年龄差

    生活 2021年10月24日
  • 配置H3C华三设备远程管理,SSH、Telnet等)

    技术配置H3C华三设备远程管理,SSH、Telnet等) 配置H3C华三设备远程管理(SSH、Telnet等)拓扑如下:
    注:本实验用一台华三路由器模仿真实设备,再一台host主机充当模拟器到本地计算机

    礼包 2021年12月16日