当前消息!美团一面:OOM后,JVM一定会退出吗?为什么?

2023-06-18 17:02:12 博客园

文章且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版为您奉上珍贵的学习资源 :

免费赠送 :《尼恩Java面试宝典》持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备免费赠送 :《尼恩技术圣经+高并发系列PDF》,帮你 实现技术自由,完成职业升级, 薪酬猛涨!加尼恩免费领免费赠送 经典图书:《Java高并发核心编程(卷1)加强版》面试必备 + 大厂必备 +涨薪必备 加尼恩免费领免费赠送 经典图书:《Java高并发核心编程(卷2)加强版》面试必备 + 大厂必备 +涨薪必备 加尼恩免费领免费赠送 经典图书:《Java高并发核心编程(卷3)加强版》面试必备 + 大厂必备 +涨薪必备 加尼恩免费领

免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值>10000元 加尼恩领取


(资料图)

美团一面:OOM后,JVM一定会退出吗?为什么?

说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如美团、拼多多、极兔、有赞、希音的面试资格,遇到一几个很重要的面试题:

  • OOM后,JVM一定会退出吗?为什么?

生产环境,很多小伙伴,也遇到过OOM后,JVM会退出的问题。

这里尼恩给大家做一下系统化、体系化的梳理,使得大家可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”

也一并把这个题目以及参考答案,收入咱们的 《尼恩Java面试宝典》V81版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

最新《尼恩 架构笔记》《尼恩高并发三部曲 》《尼恩Java面试宝典》 的PDF文件,请通过公号【技术自由圈】获取

本文目录

目录
  • 美团一面:OOM后,JVM一定会退出吗?为什么?
    • 说在前面
    • 本文目录
    • 问题背景
      • 回顾一下OOM与异常
      • 默认异常处理器
    • JVM退出条件
      • 实例一:线程OOM,JVM不一定退出
      • 实例二:线程池OOM,JVM不一定退出
      • OOM与JVM退出的关系
    • 说在最后
    • 技术自由的实现路径:
      • 实现你的 响应式 自由:
      • 实现你的 spring cloud 自由:
      • 实现你的 linux 自由:
      • 实现你的 网络 自由:
      • 实现你的 分布式锁 自由:
      • 实现你的 王者组件 自由:
      • 实现你的 面试题 自由:
    • 获取11个技术圣经PDF:

问题背景

问题是,咱们常常说:发生OOM,程序就会挂。

很多情况是: 发生OOM了,JVM没有挂。

回顾一下OOM与异常

来看一下 OutOfMemoryError,说到底,OutOfMemoryError 也只是一个java中的异常而已,

OutOfMemoryError 属于Error一系非检查异常, 其继承关系如下

Object  Throwable    Error      VirtualMachineError        OutOfMemoryError

再来看看,堆内存不够与 OutOfMemoryError 异常的关系

线程发生OutOfMemoryError,首先是堆空间不够了,然后再由jvm在申请分配空间的的时候,在调用上抛出OOM异常。

申请内存的线程,会会像处理普通的其他异常一样,处理OutOfMemoryError。

线程是资源调度的基本单位,Java在设计线程时充分考虑了线程的独立性。

在异常方面,线程也保持了线程异常的独立性。

在线程执行中,如果发生的异常,都由线程进行独立的处理,而不是也不会抛出到其它的线程。这就是保证了这种线程的独立性。

从线程的实现维度,也可以看到异常处理的策略。

线程Thread里边,最终会执行内部target对象的run方法,也就是java.lang.Runnable接口实现方法,线程通过其run方法运行,方法签名如下:

public abstract void run();

注意这个方法,run方法不能声明抛出任何检查异常(checked exception)。因此在线程方法执行中发生的任何检查异常,必须在线程中处理。

线程拿到异常,有两种处理方式:

  • 捕获并且处理异常,线程继续执行
  • 线程停止执行

默认异常处理器

如果没有被捕获

除了检查异常,java中还有非检查异常(unchecked exception),这种异常无需显式声明也能沿着方法调用链向上抛出。

线程对于这种未处理的异常,提供了默认异常处理器:

/*** Dispatch an uncaught exception to the handler. This method is* intended to be called only by the JVM. (将未被捕获的异常分发给处理器。这个方法只被JVM调用)*/private void dispatchUncaughtException(Throwable e) {   getUncaughtExceptionHandler().uncaughtException(this, e);}

Thread的init()方法线程至少有一个默认异常处理器,兜底的异常处理器是当前线程父线程的线程组ThreadGroup,可以看到线程组是有能力处理异常的:

public  class ThreadGroup implements Thread.UncaughtExceptionHandler {}

线程通过这两种机制,保证内部发生的异常,在线程内解决,而不会抛出给启动线程的外部线程。

JVM退出条件

java虚拟机退出的条件是:JVM 不存在非守护线程(前台线程),JVM就会退出。

线程发生未处理的异常(未处理异常由默认异常处理器处理)会导致线程结束,而线程结束了, 如果还有非守护线程(前台线程),JVM也不会退出。

OOM也是一种异常,它的发生也不会导致JVM退出。

所以,OOM 与JVM的退出,没有很强的关系。

以下实例说明:

实例一:线程OOM,JVM不一定退出

实例二:线程池OOM,JVM不一定退出

实例一:线程OOM,JVM不一定退出

thread-0 线程抛出OOM 后线程结束后,main线程依旧会循环打印"我还行....."。

线程中发生OOM异常,和发生其他异常一样,只是那个线程终止了,但是不影响其他线程,

thread-0 线程线程OOM,也不会导致JVM退出。

实例二:线程池OOM,JVM不一定退出

class OOMThreadPool {    private final Byte[] toLeak;    public OOMThreadPool() {        toLeak = new Byte[1024 * 1024];    }    static final Thread[] t = new Thread[1];    static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 5,            TimeUnit.SECONDS, new ArrayBlockingQueue<>(9),            new ThreadFactory() {                public Thread newThread(Runnable r) {                    t[0] = new Thread(r);                    t[0].setDaemon(false);                    t[0].setPriority(Thread.NORM_PRIORITY);                    t[0].setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {                        @Override                        public void uncaughtException(Thread t, Throwable e) {                            e.printStackTrace();                            System.out.println(t.getName() + " 的状态:" + t.getState());                            System.out.println("这里是没有捕获的处理 ====> " + t.getId() + "==> " + e.getLocalizedMessage());                        }                    });                    return t[0];                }            },            new ThreadPoolExecutor.DiscardOldestPolicy()) {        @Override        protected void afterExecute(Runnable r, Throwable t) {            System.out.println(Thread.currentThread().getName() + " 任务执行完成,但是线程不会结束");            if (null != t) {                System.out.println(Thread.currentThread().getName() + "任务异常了");                t.printStackTrace();            }        }    };    // 为快速发生oom,设置堆大小; VM args: -Xms10m -Xmx10m    public static void main(String[] args) throws InterruptedException {        List list = new LinkedList<>();        Runnable target = () -> {            System.out.println(Thread.currentThread().getName() + " 开始了");            try {                while (true) {                    list.add(new OOMThreadPool());                }            }catch ( Throwable throwable)            {                throwable.printStackTrace();            }        };        threadPool.submit(target);        while (true) {            System.out.println(Thread.currentThread().getName() + " 我还行...");            System.out.println(t[0].getName() + " 的状态:" + t[0].getState());            Thread.sleep(1000L);        }    }}

在线程池中,thread-0 线程抛出OOM 后线程结束后,main线程依旧会循环打印"我还行....."。

在线程池中,thread-0 线程 的任务结束了, 但是 线程没有结束,还是可以执行新任务的。

OOM与JVM退出的关系

什么时候发生OOM、JVM才退出呢?

  • 场景1:所有的非守护线程由于申请不到内存而OOM,所有非守护线程退出,JVM退出,这个属于主动退出

OOM的发生表示了此刻JVM堆内存告罄,不能分配出更多的资源,或者GC回收效率不可观。

一个线程的OOM,在一定程度的并发下,若此时其他线程(含非守护线程)也需要申请堆内存,那么其他线程也会因为申请不到内存而OOM,甚至连锁反应导致整个JVM的退出。

  • 场景2:OOM溢出,说明内存耗尽,如果操作系统内存耗尽,就会发生OOM killer(Out Of Memory killer),干掉JVM进程,导致被动退出

Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。如何判断和选择一个”bad进程呢?linux选择”bad”进程是通过调用oom_badness(),挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程。

说在最后

OOM相关面试题,是非常常见的面试题。

以上的5大方案,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。

最终,让面试官爱到 “不能自已、口水直流”。 offer, 也就来了。

学习过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。

技术自由的实现路径:

实现你的 响应式 自由:

《响应式圣经:10W字,实现Spring响应式编程自由》

这是老版本 《Flux、Mono、Reactor 实战(史上最全)》

实现你的 spring cloud 自由:

《Spring cloud Alibaba 学习圣经》 PDF

《分库分表 Sharding-JDBC 底层原理、核心实战(史上最全)》

《一文搞定:SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系(史上最全)》

实现你的 linux 自由:

《Linux命令大全:2W多字,一次实现Linux自由》

实现你的 网络 自由:

《TCP协议详解 (史上最全)》

《网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!》

实现你的 分布式锁 自由:

《Redis分布式锁(图解 - 秒懂 - 史上最全)》

《Zookeeper 分布式锁 - 图解 - 秒懂》

实现你的 王者组件 自由:

《队列之王: Disruptor 原理、架构、源码 一文穿透》

《缓存之王:Caffeine 源码、架构、原理(史上最全,10W字 超级长文)》

《缓存之王:Caffeine 的使用(史上最全)》

《Java Agent 探针、字节码增强 ByteBuddy(史上最全)》

实现你的 面试题 自由:

4000页《尼恩Java面试宝典 》 40个专题

获取11个技术圣经PDF:

标签:

相关文章

当前消息!美团一面:OOM后,JVM一定会退出吗?为什么?

文章且持续更新,建议收藏起来,慢慢读![**疯狂创客圈总目录博客园版*

2023-06-18

荣耀70 Pro判断是否翻新机方法介绍 天天滚动

荣耀70Pro这款手机的颜值可真的是太高了,在今年的6月10日发售,这款手

2023-06-18

趋势抄底指标公式_环球今亮点

DRAWGBK(C>0,RGB(100,0,0),RGB(1,1,5),1,0,1);cxh1:=(HHV(HIGH,9)-C

2023-06-18

【环球时快讯】江苏2023年企退养老金上调方案何时公布?养老金补发金额具体为多少?

2023年养老金调整方案已经下发近一个月的时间了,这标志着我国退休人员

2023-06-18

当前讯息:财务报表中的营业收入包括哪些_营业收入主要包括哪些内容

1、营业收入包括主营业务收入和其他业务收入。2、主营业务收入是指企业

2023-06-18

天天动态:13岁女生过生日送什么礼物学习用具

可以送一本有趣的阅读书籍、笔记本和笔等学习用具。如果想要增加互

2023-06-18

贵州省福泉市发布雷电黄色预警 每日报道

福泉市气象台6月18日14时13分发布雷电黄色预警信号:预计未来3小时我市

2023-06-18

饮艾草茶、品艾草粽……大兴区礼贤镇首届艾草文化节开幕

北京日报客户端|记者陈强武亦彬6月18日,大兴区礼贤镇首届艾草文化节在

2023-06-18

柏拉丁_关于柏拉丁概略-天天观速讯

1、柏拉丁,是日本动画《爆丸》中登场的角色。文章到此就分享结束,希

2023-06-18

怎样开好一家网店_应该怎么做 环球资讯

1、一开始不是在网上,而是在你的脑海里。你需要弄清楚你想开什么样的

2023-06-18

6.18赛事预测:熬夜五小时精选早场预测 (内含胜平负 比分)

日联杯:大阪樱花VS大阪钢巴比赛时间:2023 06 1817:00综合分析:大阪樱

2023-06-18

支付宝花呗还款日期怎么修改_支付宝花呗不还款会怎么样

1、使用蚂蚁花呗不还款会降低芝麻分值。2、拥有较高芝麻分值的人可以享

2023-06-18

天天最资讯丨手机卡实名制可以改吗(手机卡实名制)

诸多的对于手机卡实名制可以改吗,手机卡实名制这个问题都颇为感兴趣的

2023-06-18

解剖屎山,寻觅黄金之第二弹-全球热议

大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我

2023-06-18

世界新消息丨交易异动!光迅科技:近3个交易日上涨26.65% 公司前期披露的信息不存在需要更正、补充之处

光迅科技(SZ002281,收盘价:36 69元)6月18日晚间发布公告称,武汉光

2023-06-18

武清区黄花店镇农耕文化旅游节开幕 “丰”吹麦浪 穗穗金“黄”

图为游客在农民的指导下收割。本报记者高莹辉摄  天津北方网讯:右手

2023-06-18

世界热点评!清代索绰络·英和行楷书《艺林韫古》册

索绰络·英和(1771年5月27日——1840年7月8日)[1],初名石桐,字树琴

2023-06-18

京东二十周年发布“35711”梦想 未来将提供超过100万就业岗位

6月18日,京东迎来二十周年。在当天向56万员工发送的《凝心聚力迈向“3

2023-06-18

热门:虚拟数字生命[自己的同人]

如果数字生命是真实的,我不得不怀疑世界了,世界到底是由什么构成的,

2023-06-18

当前消息!兰州外语职业学院官网系_兰州外语职业学院教务管理系统

1、你好!你先进入兰州石化职业技术学院首页,如果你是学校内部人员,

2023-06-18

【全球独家】“新东方差点就进入房地产” 俞敏洪最新表态:从没打算让孩子继承公司!

2023年亚布力论坛第九届创新年会于6月17日-18日在山西太原召开。6月17

2023-06-18

逆水寒手游特技打造攻略推荐

逆水寒手游特技打造攻略分享是逆水寒手游游戏中新推出的热门内容,很多

2023-06-18

【世界独家】英媒:西方违背其气候承诺造成严重后果

近年来,对于西方国家在应对气候变化过程中频频拖欠气候资金、屡屡在减

2023-06-18

四川省盐源县发布雷电黄色预警

盐源县气象台2023年06月18日13时46分发布雷电黄色预警信号:目前我县有

2023-06-18

暑期游亲子订单同比涨超7倍,旅游业迎来结构性复苏新阶段|乐言商业

2023年已进入6月中旬,从上半年的旅游市场情况来看,春节、“五一”假

2023-06-18

五十度灰3(五十度灰未删减版)|世界资讯

大家好,小乐来为大家解答以上的问题。五十度灰3,五十度灰未删减版这个

2023-06-18

卡西欧dst怎么设置_卡西欧dst-天天即时

1、你说的应该是卡西欧的手表dst是夏令时的意思··摘自百度···夏时

2023-06-18

全球讯息:冲上榜首!还得是东北,杠杠滴!

全民“囤健康”的时代正在到来《中国美好生活大调查》数据显示:在家庭

2023-06-18

亮度调节电脑快捷键 台式电脑亮度调节电脑快捷键

(不能使用亮度调节计算机快捷键)很多朋友想调整电脑显示屏的亮度,如果

2023-06-18

环球热讯:如何找回微信已经删除的好友 找回微信已经删除的好友方法 怎么找回微信已经删除的好友

微信已经删除的好友如何找回?很多朋友在使用中都存在这个疑惑,那就来

2023-06-18

最新发布
精彩图文
精彩推送

Copyright ©  2015-2022 国华娱乐网版权所有  备案号:京ICP备2021034106号-22   联系邮箱:55 16 53 8 @qq.com