美团面试题 | JVM 堆内存溢出后,其他线程是否可继续工作?

作者:gosaintmrc

来源:http://sina.lt/gqaM

最近网上出现一个美团面试题:“一个线程OOM后,其他线程还能运行吗?”

我看网上出现了很多不靠谱的答案。这道题其实很有难度,涉及的知识点有jvm内存分配、作用域、gc等,不是简单的是与否的问题。

由于题目中给出的OOM,java中OOM又分很多类型;比如:堆溢出(“java.lang.OutOfMemoryError: Java heap space”)、永久带溢出(“java.lang.OutOfMemoryError:Permgen space”)、不能创建线程(“java.lang.OutOfMemoryError:Unable to create new native thread”)等很多种情况。

本文主要是分析堆溢出对应用带来的影响。

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

代码如下:

public class JvmThread {public static void main(String[] args) {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();// 线程二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" java.lang.OutOfMemoryError: Java heap space
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堆空间的变化。我们仔细观察一下在14:42:05~14:42:25之间曲线变化,你会发现使用堆的数量,突然间急剧下滑!这代表这一点,当一个线程抛出OOM异常后,它所占据的内存资源会全部被释放掉,从而不会影响其他线程的运行!

讲到这里大家应该懂了,此题的答案为一个线程溢出后,进程里的其他线程还能照常运行。注意了,这个例子我只演示了堆溢出的情况。如果是栈溢出,结论也是一样的,大家可自行通过代码测试。

总结

其实发生OOM的线程一般情况下会死亡,也就是会被终结掉,该线程持有的对象占用的heap都会被gc了,释放内存。因为发生OOM之前要进行gc,就算其他线程能够正常工作,也会因为频繁gc产生较大的影响。

近期热文

 
  • 面试珍藏:最常见的200多道Java面试题

  • 被一个熟悉的面试题问懵了:String...

  • 面试官:如何实现幂等性校验?

【END】

关注下方二维码,订阅更多精彩内容

朕已阅 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面向对象设计原则

面向对象设计原则是OOPS&#xff08;Object-Oriented Programming System,面向对象的程序设计系统&#xff09;编程的核心&#xff0c;但大多数Java程序员追逐像Singleton、Decorator、Observer这样的设计模式&#xff0c;而不重视面向对象的分析和设计。甚至还有经验丰富的Jav…

Python格式化字符串f-string常用用法

简介&#xff1a; f-string&#xff0c;亦称为格式化字符串常量&#xff08;formatted string literals&#xff09;&#xff0c;是Python3.6新引入的一种字符串格式化方法&#xff0c;该方法源于PEP 498 – Literal String Interpolation&#xff0c;主要目的是使格式化字符串…

面试官 | Java 对象不使用时为什么要赋值为 null?

作者 | zhantong来源 | www.polarxiong.com前言许多Java开发者都曾听说过“不使用的对象应手动赋值为null“这句话&#xff0c;而且好多开发者一直信奉着这句话&#xff1b;问其原因&#xff0c;大都是回答“有利于GC更早回收内存&#xff0c;减少内存占用”&#xff0c;但再往…

CentOS 6.5下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器

一、简介 LogAnalyzer 是一款syslog日志和其他网络事件数据的Web前端。它提供了对日志的简单浏览、搜索、基本分析和一些图表报告的功能。数据可以从数据库或一般的syslog文本文件中获取&#xff0c;所以LogAnalyzer不需要改变现有的记录架构。基于当前的日志数据&#xff0c;它…

PyQt5 Python主对话框创建关于对话框源代码

PyQT5 Python主对话框菜单“帮助”下的“关于”按钮,创建关于对话框,如下: main.py源代码 """ python主文件 """ # -*- coding: utf-8 -*- import os import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication, Q…

国内各大厂 | 简历投递信息汇总和精美模板下载

作者 | 王磊来源 | Java中文社群1 前言为了让你的简历能被各大厂商的 HR 第一时间看到&#xff0c;我人工整理了以下投递渠道方便你能直接投递&#xff0c;下面一起来看&#xff08;排名不分先后&#xff09;。2 投递信息汇总阿里巴巴https://campus.alibaba.com/index.htm腾讯…

关于UIView的userInteractionEnabled属性

如果父视图为ParentView包含一个Button&#xff0c;如果再ParentView上添加子视图ChildView&#xff0c;且ChildView盖住了 Button&#xff0c;那么Button就得到不响应了&#xff0c;为了让Button响应&#xff0c;可以设置ChildView的userInteractionEnabled &#xff1d; NO&a…

Python PIL调整图片大小、尺寸和转换图片格式,removebg改变图片背景、透明化处理

1.简介:Python利用PIL Image可以调整图片尺寸(宽度和高度)、图片大小和转换图片格式,Python利用removebg可以改变图片背景、透明化处理。 2.特点:简单方便、快速。 3.适用人群:想学习Python处理图片的初学者。 main.py源代码 """--------------------…

面试官 | 为什么用了索引之后,查询就会变快?

为什么用了索引之后&#xff0c;查询就会变快&#xff1f;相信很多程序员朋友对数据的索引并不陌生&#xff0c;最常见的索引是 B Tree 索引&#xff0c;索引可以加快数据库的检索速度&#xff0c;但是会降低新增、修改、删除操作的速度&#xff0c;一些错误的写法会导致索引失…

社会化海量数据采集爬虫框架搭建

随着BIG DATA大数据概念逐渐升温&#xff0c;如何搭建一个能够采集海量数据的架构体系摆在大家眼前。如何能够做到所见即所得的无阻拦式采集、如何快速把不规则页面结构化并存储、如何满足越来越多的数据采集还要在有限时间内采集。这篇文章结合我们自身项目经验谈一下。 我们来…

【博主推荐】Python 基于Xlwings、Openpyxl自己重新封装Python操作Excel类

1.简介:Python操作Excel,常用Xlwings、Openpyxl类,由于其知识琐碎,使用起来不太方便,因此自己把常用用法重新封装一个操作类。 2.应用场景:使用Python操作Excel,读、写、改、删情景,能大大提升工作效率。 3.适用人群:想学习Python操作Excel的人员。 一、Python 基于…

面试官 | Nginx 是什么?有什么作用?

作者 | 蔷薇Nina来源 | cnblogs.com/wcwnina/p/8728391.htmlNginx 同 Apache 一样都是一种 Web 服务器。基于 REST 架构风格&#xff0c;以统一资源描述符&#xff08;Uniform Resources Identifier&#xff09;URI 或者统一资源定位符&#xff08;Uniform Resources Locator&a…

CTF【解密】字符串flag被加密成已知新字符串,请解密出flag,可以使用Python解码出WriteUp

CTF-解密&#xff1a; 找出flag task.py # -*- coding: utf-8 -*-assert flag[0:5] flag{strAlphabet abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZdef encode(strOld, x, y, n):strNew for i in strOld:if i in strAlphabet:num strAlphabet.index(i) # 返回…

面试官 | count(1)、count(*) 、count(列名) 有什么区别?

作者 | BigoSprite来源 | 39sd.cn/0926A先看执行效果&#xff1a;1. count(1) and count(*)当表的数据量大些时&#xff0c;对表作分析之后&#xff0c;使用count(1)还要比使用count(*)用时多了&#xff01; 从执行计划来看&#xff0c;count(1)和count(*)的效果是一样的。但是…

python ping利用线程池获取在线设备

python ping获取一个VLAN在线设备 myPyPingDevice.py """=== coding: UTF8 ===""" # 线程池:一次性开辟一些线程,我们用户直接给线程池提交任务,线程任务的调度交给线程池来完成 from concurrent.futures import ThreadPoolExecutor import…

【吐血整理】年度盘点 | 2019年Java面试题汇总篇——附答案

在这岁月更替辞旧迎新的时刻&#xff0c;老王盘点了一下自己 2019 年发布的所有文章&#xff0c;意外的发现关于「Java面试」的主题文章&#xff0c;竟然发布了 52 篇&#xff0c;几乎是全年每周一篇面试文章的节奏&#xff0c;当然其中有不少的面试题来源于网络&#xff0c;但…

【工作记录】android手势事件操作记录

/* 用户按下触摸屏、快速移动后松开 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { //参数解释&#xff1a; // e1&#xff1a;第1个ACTION_DOWN MotionEvent // e2&#xff1a;最后一个ACTION_MOVE MotionEvent // velocityX&…

年终盘点 | 2019年Java面试题汇总篇(附答案)

作者 | 老王来源 | Java中文社群「微信公众号」在这岁月更替辞旧迎新的时刻&#xff0c;老王盘点了一下自己 2019 年发布的所有文章&#xff0c;意外的发现关于「Java面试」的主题文章&#xff0c;竟然发布了 52 篇&#xff0c;几乎是全年每周一篇面试文章的节奏&#xff0c;当…

Python操作MySQL的封装类

myPySql.py # -*- coding: utf-8 -*- import re import pymysql import myGlobal # myGlobal全局变量文件class MySql:"""python操作mysql数据库"""def __init__(self, strHost=127.0.0.1, nPort=3306,

面试官 | 如何在 Spring Boot 中进行参数校验?

作者 | 狂乱的贵公子来源 | cnblogs.com/cjsblog/p/8946768.html开发过程中&#xff0c;后台的参数校验是必不可少的&#xff0c;所以经常会看到类似下面这样的代码这样写并没有什么错&#xff0c;还挺工整的&#xff0c;只是看起来不是很优雅而已。接下来&#xff0c;用Valida…