文档章节

多线程场景下,触发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
【Bugly干货分享】Android性能优化典范之多线程篇

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

腾讯Bugly
2016/05/23
381
1
java使用Map做缓存你真的用对了吗?弱引用WeakHashMap了解一下

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

intsmaze(刘洋)
08/16
0
0
阿里的面试官都喜欢问哪些技术问题?

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

Java填坑之路
08/26
0
0
Android中多线程切换的几种方法

我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。 我们先回顾一下Java多线程的几个基础内容,然后再分析...

蓝灰_q
01/01
0
0
知识点

蓝厂: 1.事件分发流程 2.View的渲染机制 3.动画的原理,底层如何给上层信号 编译打包的过程 5.Android有多个资源文件夹,应用在不同分辨率下是如何查找对应文件夹下的资源的,描述整个过程 ...

咖喱配胡椒
2017/10/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 到底谁是小公猫……

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子:分享Trivium的单曲《Throes Of Perdition》 《Throes Of Perdition》- Trivium 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁:...

小小编辑
今天
187
4
基础选择器

注意:本教程参考自网上流传的李兴华老师的jquery开发框架视频,但是苦于没有相应的配套笔记,由我本人做了相应的整理. 本次学习的内容 学习jquery提供的各种选择器的使用,掌握了jquery选择...

江戸川
今天
1
0
Spring中static变量不能@value注入的原因

今天本想使用@Value的方式使类中的变量获得yml文件中的配置值,然而一直失败,获得的一直为null。 类似于这样写的。 public class RedisShardedPool { private static ShardedJedisPool pool...

钟然千落
今天
2
0
CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
2
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部