文档章节

多线程场景下,触发OOM的线程是否会影响其他线程的工作

麦馍
 麦馍
发布于 09/26 12:33
字数 548
阅读 6
收藏 0
public static void main(String[] args) {

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                int i = 0;
                List<Byte[]> list = new ArrayList<>();
                while(true) {
                    i++;
                    try {
                        list.add(new Byte[1024*1024]);
                        System.out.print("success"+(i)+"\n");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        Thread t2 = new Thread(new Runnable() {
           @Override
           public void run() {
               try {
                   Thread.sleep(100);
                   System.out.println("just running");
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
        });
        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(100);
                        List<Byte[]> list = new ArrayList<>();
                        list.add(new Byte[1024*1024]);
                        System.out.print("sleep\n");
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        t1.start();
        t2.start();
        t3.start();
}

      上面这段代码中,main函数中开启了三个线程t1、t2和t3,t1不断地在堆中申请大块的内存空间,t3每隔100毫秒在堆中申请一块大内存空间。程序运行一段时间后t1线程导致堆内存发生OOM,t1线程被终止。

      t2线程不需要申请堆内存空间,所有堆内存的OOM不会影响t2,t2照常运行;

      t3线程依然在以固定频率申请堆内存空间,此时t3是否能正常工作,取决于其每次申请堆内存空间的操作能否成功。此时堆内存由于t1导致的OOM触发了GC,GC回收是需要一定时间的,不是一蹴而就的,所以t3能否正常工作就取决于GC的速度能否赶上t3申请堆内存空间的速度了。

      以上分析是针对堆空间做出的,堆空间是最容易发生OOM的区域,但是方法区和虚拟机栈也有可能发生OOM。方法区中存储了类、接口、方法、字段等元数据信息。方法区中的数据通常是由虚拟机加载class文件时存储的,但是在程序运行的过程中,也同样可以通过动态代理等方式产生一些字节码文件写入方法区,所以方法区也是有可能出现OOM的。对于虚拟机栈而言,在线程数量不断增加的情况下,也有可能导致OOM。但是分析的方法是相同的。

 

 

© 著作权归作者所有

共有 人打赏支持
麦馍
粉丝 1
博文 6
码字总数 5423
作品 0
私信 提问
jvm堆内存溢出后,其他线程是否可继续工作

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

别打我会飞
10/31
0
0
阿里的面试官都喜欢问哪些技术问题?

金九银十是招聘的旺季,小编在这里也给大家整理了一套阿里面试官最喜欢问的问题或者出场率较高的面试题,助校招或者社招路上的你一臂之力! 首先我们需要明白一个事实,招聘的一个很关键的因...

Java填坑之路
08/26
0
0
java使用Map做缓存你真的用对了吗?弱引用WeakHashMap了解一下

目录 关于缓存我们应该考虑什么?-intsmaze WeakHashMap弱引用-intsmaze 线程安全问题-intsmaze 序:使用java的Map做缓存,你是否考虑过容量导致的OOM问题,是否考虑命中率对性能的影响?? ...

intsmaze(刘洋)
08/16
0
0
Java程序员从阿里拿到offer回来,这些面试题你会吗?

前不久刚从阿里面试回来,为了这场面试可以说准备了一个半月,做的准备就是刷题和看视频看书充实自己的技术,话说是真难啊,不过还算顺利拿到了offer,有很多面试题我已经记不起来了,这些是...

Ala6
11/21
45
0
【Bugly干货分享】Android性能优化典范之多线程篇

本文涉及的内容有:多线程并发的性能问题,介绍了 AsyncTask,HandlerThread,IntentService 与 ThreadPool 分别适合的使用场景以及各自的使用注意事项,这是一篇了解 Android 多线程编程不可...

腾讯Bugly
2016/05/23
381
1

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
33分钟前
2
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
1
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
2
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部