我也来说说经典面试题目-“OOM异常会导致JVM退出吗?”
经典面试题目“OOM异常会导致JVM退出吗?
我的回答是“这要分情况看,对于守护线程来说,OOM并不会导致JVM退出;对于非守护线程来说,如果某个线程捕获了OOM异常并正确进行了处理,那JVM并不会退出;如果线程没有捕获异常,那么将由全局的异常处理器处理,默认的全局的异常处理器也会让当前这个发生异常的线程退出,但是如果这个线程是最后一个非守护线程,那么JVM会退出,如果不是,JVM并不会退出。
对于守护线程来说,OOM并不会导致JVM退出,这里有一个非常好的线上故障:https://blog.csdn.net/shuxiaohua/article/details/114658325 ,缺少的接收客户端请求的线程Acceptor是一个守护线程,并且因为OOM退出时,并没有让Tomcat退出。
下面介绍一下非守护线程的情况,这些非守护线程通常就是处理业务的线程。每一个写过Java的人都应该知道Java异常继承体系,如下图所示。

这里我们要注意一点,就是Exception和Error有共同的父类Throwable,这意味着异常和错误都可以在Java层捕获,例如:
public static void main(String[] args) throws InterruptedException {
try{
// 每个整数数组的大小为4M
int[] array1 = new int[1_000_000];
int[] array2 = new int[1_000_000];
int[] array3 = new int[1_000_000];
int[] array4 = new int[1_000_000];
int[] array5 = new int[1_000_000];
}catch (Throwable t){
t.printStackTrace();
}
System.out.println("程序走到了这里!");
}
我们在指定参数-Xms20M -Xmx20m后,运行打印结果如下:
java.lang.OutOfMemoryError: Java heap space
at cn.hotspotvm.TestError.main(TestError.java:12)
程序走到了这里!
可以看到,即使发生了错误,这个线程依然在正常运行,如果我们不对Error进行捕获呢?如下:
public static void main(String[] args) throws InterruptedException {
int[] array1 = new int[1_000_000];
int[] array2 = new int[1_000_000];
int[] array3 = new int[1_000_000];
int[] array4 = new int[1_000_000];
int[] array5 = new int[1_000_000];
System.out.println("程序走到了这里!");
}
再次运行后就的打印结果如下:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at cn.hotspotvm.TestError.main(TestError.java:10)
可以看到,在发生错误时这个线程没有走到打印语句,而是直接退出了。
这里其实要说明的是,我们可以设置一个全局的异常处理器来统一处理,或者优先针对某个线程设置异常处理器,这样当我们忽略了捕获错误时,可以在全局异常处理器中进行处理。举个例子如下:
public static void main(String[] args) throws InterruptedException {
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("这里是全局异常处理 "+e.getLocalizedMessage());
}
});
int[] array1 = new int[1_000_000];
int[] array2 = new int[1_000_000];
int[] array3 = new int[1_000_000];
int[] array4 = new int[1_000_000];
int[] array5 = new int[1_000_000];
System.out.println("程序走到了这里!");
}
打印的信息如下:
这里是全局异常处理 Java heap space
这个线程在全局异常处理中如果没有特殊处理,通常会让当前的线程退出。如果当前线程退出,那么JVM会退出吗?
其实Java虚拟机退出的条件是:虚拟机内已经没有了非守护线程。线程发生未处理的异常最终导致线程结束时,如果这个线程是最后一个非守护线程,则会退出,否则不退出。
更多文章可访问:JDK源码剖析网

我也来说说经典面试题目-“OOM异常会导致JVM退出吗?”的更多相关文章
- JVM OOM异常会导致JVM退出吗?
出处: https://mp.weixin.qq.com/s/8j8YTcr2qhVActLGzOqe7Q https://blog.csdn.net/h2604396739/article/de ...
- 33条C#、.Net经典面试题目及答案
33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如".NET中类和结构的区别"."ASP.NET页面之间传递值的几种方式? ...
- 33条C#、.Net经典面试题目及答案[zt]
33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如“.NET中类和结构的区别”.“ASP.NET页面之间传递值的几种方式?”,并简明扼要的给出了答案,希 ...
- 经典面试题目——250M内存处理10G大小的log文件
前言 周末逛知乎的时候,看到的一个经典面试题目:http://www.zhihu.com/question/26435483.非常经典的一道分而治之的题目. 题目描写叙述例如以下: 有次面试遇到一个问 ...
- C语言经典面试题目(转的,不过写的的确好!)
第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一 ...
- cc++面试------17道经典面试题目分析
以下是C/C++面试题目,共计17个题目,其中涵盖了c的各种基础语法和算法, 以函数接口设计和算法设计为主.这17个题目在C/C++面试方面已经流行了多 年,大家需要抽时间掌握好,每一个题目后面附有参 ...
- 一道JAVA经典面试题目的两种解法
题目要求:String s="-1 2 5 78 129 -65 -23";将字符串进行升序排序后输出. 方法一:使用数组进行排序 思路: 1.获取字符串中的数值: 2.将数组 ...
- 倒水问题-->经典面试题目
题目详细: 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水.我们还有一个足够大的水缸,足够容纳C升水.起初它是空的,我们只能往水缸里倒入水,而不能倒出.可以进行的操作是:把一个容器灌满 ...
- 2017最新PHP经典面试题目汇总(上篇)
1.双引号和单引号的区别 双引号解释变量,单引号不解释变量 双引号里插入单引号,其中单引号里如果有变量的话,变量解释 双引号的变量名后面必须要有一个非数字.字母.下划线的特殊字符,或者用{}讲变量括起 ...
- 经典面试题目——找到第n个丑数(参考《剑指offer(第二版)》面试题49)
一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如 ...
随机推荐
- nc命令-Netcat (网络刀)
https://blog.csdn.net/freeking101/article/details/53289198 nc参数 1) -l 用于指定nc将处于侦听模式.指定该参数,则意味着nc被当作s ...
- 【忍者算法】从照片旋转到矩阵变换:探索图像旋转问题|LeetCode 48 旋转图像
从照片旋转到矩阵变换:探索图像旋转问题 生活中的旋转 在这个自拍时代,我们经常需要调整照片的方向.有时拍出来的照片歪了,需要旋转90度:有时想要换个角度看看效果,来回旋转照片.这种旋转操作不仅存在于我 ...
- 深度学习中CUDA环境安装教程
首先说明,本人是小白,一次安装,可能有不对的地方,望包含. 安装CUDA 因为我们是深度学习,很多时候要用到gpu进行训练,所以我们需要一种方式加快训练速度. 通俗地说,CUDA是一种协助" ...
- SHA1字符串加密
使用SHA1算法,生成某个字符串的hash值作为该字符串所代表对象的唯一标识: Demo: using System; using System.Collections.Generic; using ...
- __I、 __O 、__IO是什么意思?volatile,const 怎么用?
原文:https://blog.csdn.net/qq_27312943/article/details/51273064 __I. __O .__IO是什么意思? 这是ST库里面的宏定义,定义如下: ...
- Vulnhun靶机-kioptix level 4-sql注入万能密码拿到权限ssh连接利用mysql-udf漏洞提权
一.环境搭建 然后选择靶机所在文件夹 信息收集 本靶机ip和攻击机ip 攻击机:192.168.108.130 靶机:192.168.108.141 扫描ip 靶机ip为:192.168.108.14 ...
- Azure Databricks - [02] 常用SQL
查看当前所在catalog:select current_catalog(); 创建catalog:create catalog if not exists harley_test; 创建表 crea ...
- 基于 Flink+Iceberg 构建企业级实时数据湖
Apache Flink 是大数据领域非常流行的流批统一的计算引擎,数据湖是顺应云时代发展潮流的新型技术架构.那么当 Apache Flink 遇见数据湖时,会碰撞出什么样的火花呢?本次分享主要包括以 ...
- SQL Server 2005与2008清空日志方法
SQL2008 的收缩日志 由于SQL2008对文件和日志管理进行了优化,所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消:SQL2005 清空日志的方法:Backup Log D ...
- Ai 文本生成式大模型 基础知识
提示工程-RAG-微调 工程当中也是这个次序 提示词工程 RAG 微调 先问好问题 再补充知识 最后微调模型 RAG相关技术细节 选择合适的 Chunk 大小对 RAG 流程至关重要. Chunk 过 ...