引言

这题是一个网友@大脸猫爱吃鱼给我的提问,出自今年校招美团三面的一个真题。大致如下

一个进程有3个线程,如果一个线程抛出oom,其他两个线程还能运行么?

先说一下答案,答案是还能运行

不瞒大家说,真在面试中,我遇到这一题,我估计也是答错。因为我初看到这一题,内心嘿嘿一笑,觉得这题是在考察JVM的内存结构。我第一反应是OOM的常见情况堆溢出,也就是下面的这种异常

java.lang.OutOfMemoryError: Java heap space

先回忆一下,多线程中栈与堆是公有的还是私有的?回答如下

在多线程环境下,每个线程拥有一个栈和一个程序计数器。栈和程序计数器用来保存线程的执行历史和线程的执行状态,是线程私有的资源。其他的资源(比如堆、地址空间、全局变量)是由同一个进程内的多个线程共享。

也就是说,堆是线程共享。那么一个线程堆抛出OOM异常,我第一反应是另外两个线程也抛出OOM异常,毕竟堆是共有的,大家应该都抛出异常。于是,我机智的让@大脸猫爱吃鱼写个代码去测试一下,结果我被啪啪啪打脸了。

测试代码伪如下

一个线程去构造堆溢出,每隔1S申请一次堆,代码长下面这样

new Thread(() -> {List<byte[]> list=new ArrayList<byte[]>();while(true){System.out.println(new Date().toString()+Thread.currentThread()+"==");byte[] b = new byte[1024*1024*1];list.add(b);try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}}
}).start();

另一个线程,睡眠1秒然后输出就好,代码长下面这样

new Thread(() -> {while(true){System.out.println(new Date().toString()+Thread.currentThread()+"==");try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}}
}).start();

结果,输出是长下面这样的

大家发现了么,一个线程溢出了,其他线程还在跑,这好像和我们的认知不大一样。坦白说,我看到这个结果,瞬间觉得自己一世英名毁于一旦,从此无法抬起头来做人。没办法了,只能亮出工具来看一下了。

先说一下,在本例测试中,参数如下

-Xms16m -Xmx32m
-Xms 初始堆内存
-Xmx 最大堆内存

接下来,亮出JvisualVM看堆的变化,注意看上面那张图,抛出OOM的时间约在00:11:45左右,因此我们需要重点关注00:11:45左右的曲线变化,如下图所示

如图所示,我们仔细观察一下在00:11:44~00:11:45之间曲线变化,你会发现使用堆的数量,突然间急剧下滑!这代表着一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行!

讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。

写在最后:

更多关于Java的技术和资讯可以关注我的专栏:

Java架构筑基​zhuanlan.zhihu.com

专栏免费给大家分享Java架构的学习资料和视频

java进程内存一直没释放_面试官:一个线程OOM,进程里其他线程还能运行么?...相关推荐

  1. java进程内存一直没释放_五分钟彻底搞懂你一直没明白的Linux内存管理

    现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的.对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在进程看来,内 ...

  2. rm 空间不释放_面试官跟我说rm删除文件之后,空间就被释放了吗?我该怎么答...

    在Linux里面,你是不是也曾经天真的认为,只要使用rm去删除一个文件,那么这个文件所占用的空间就释放了?你要是这样认为,那事情就可能不如人意了 产生一个指定大小的随机内容文件 先看一下当前各个挂载目 ...

  3. 操作系统的线程和进程的区别_面试官:你熟悉多线程嘛?线程跟进程有什么区别?...

    这篇文章跟大家聊聊线程,讲到线程,⼜不得不提进程了~ 进程我们估计是很了解的了,在windows下打开任务管理器,可以发现我们在操作系统上运⾏的程序都是进程. 什么是叫一个进程? 什么叫一个线程? 进 ...

  4. jmeter 线程执行顺序_面试官让我说出8种线程顺序执行的方法!我懵了

    https://www.cnblogs.com/wenjunwei/p/10573289.html 一.前言 本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止 ...

  5. 线程池拒绝策略 开发中常用什么策略_面试官:说说你知道多少种线程池拒绝策略...

    往期文章 为什么阿里Java规约要求谨慎使用SimpleDateFormathttps://www.toutiao.com/i6696127929048367629/ 为什么我强烈推荐你用枚举来实现单 ...

  6. java如何实现redis分片存储_面试官:你说一下Redis吧,怎么实现高可用,还有持久化怎么做的?...

    前言 作为Java程序员,在面试过程中,缓存相关的问题是躲不掉的,肯定会问,例如缓存一致性问题,缓存雪崩.击穿.穿透等.说到缓存,那肯定少不了Redis,我在面试的时候也是被问了很多关于Redis相关 ...

  7. cass道路道路设计参数文件命令为什么没反应_面试官不讲武德问我:为什么MySQL不建议使用delete删除数据?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  8. java中的分页 效率考虑_面试官:数据量很大,分页查询很慢,有什么优化方案?...

    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 下面简单说一下我知道的一些 ...

  9. java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

最新文章

  1. 一篇文章教你学会Java泛型
  2. 数字电路技术可能出现的简答题_数字电子技术复习题(本科)
  3. GridView简单创建序号列
  4. PCR之父凯利·穆利斯:有才,真的可以为所欲为
  5. 从零开始学Pytorch(十二)之凸优化
  6. 往远程mysql传数据库_三、Navicat将远程MySql数据库数据导入本地
  7. 5G 是未来的唯一选择?| 畅言
  8. 十、K8s 其他控制器(DS、RC、RS、STS)
  9. zabbix配置web监控实现网页监控
  10. Android App图标尺寸
  11. PADS——原理图的绘制
  12. 大学生个人职业生涯规划书PPT
  13. 在Java中产生随机数及掷骰子
  14. python中bd是什么属性_聊一聊:Python中对象的属性
  15. chrome浏览器谷歌浏览器打开是hao123
  16. 软考中级软件设计笔记
  17. 锚定一个点,然后在这个点上深耕
  18. 哪里有英语,哪里有欢乐
  19. vue3.2+ 滑动验证组件,pc/手机通用,即插即用
  20. 结构方程模型(SEM)概述(1)

热门文章

  1. 035、Linux下Dmidecode查看硬件信息
  2. [转]使用target_system进行erlang应用的发行
  3. 开发常见错误解决(1)注册.NET EnterpriseServices COM+组件,事务服务不可用
  4. Spring BeanFactoryPostProcessor接口详细使用
  5. k8s argo workflow获取登录token的命令
  6. Geomesa-Hbase单机部署及ingest、export shp文件数据
  7. 大数据集群问题排查:时间不同步导致hbase regionserver只启动了部分节点的进程
  8. 【收藏】Win10:路径长度超过260个字符
  9. C语言:gcc编译过程及make命令、makefile语法规则
  10. Python Django模板语法标签代码示例(页面渲染与取值)