StackOverflowError的JVM处理方式

背景:

事情来源于生产的一个异常日志
Caused by: java.lang.StackOverflowError: null at java.util.stream.Collectors.lambda$groupingBy$45(Collectors.java:908) at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
发生该异常并定位到是某个规则的问题后,我们手动修复了规则,不过我们无法确定是否需要重启容器,所以引申出来了发生StackOverflowError是否需要重启容器恢复的讨论

JVM对StackOverflowError线程的处理

结论是JVM只会中断发生StackOverflowError的线程,对于其他未发生StackOverflowError的线程没有影响,验证代码如下:

package stackoverflow;/*** 验证JVM处理StackOverflowError的方式,只会中断异常线程,不影响主线程以及其他线程的执行*/
public class StackOverFlowTest {public static void main(String[] args) throws Exception {Thread stackOverflowErrorThread = new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(60000L);} catch (InterruptedException e) {e.printStackTrace();}// 进入死循环callRecursiveMethod();}}, "StackOverflowErrorThread");Thread otherNormalThread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {System.out.println("I am otherNormalThread thread!!");try {Thread.sleep(10000L);} catch (InterruptedException e) {e.printStackTrace();}}}}, "otherNormalThread");stackOverflowErrorThread.start();otherNormalThread.start();Thread.currentThread().setName("mainThread");while (true) {System.out.println("I am main thread!!");try {Thread.sleep(10000L);} catch (InterruptedException e) {e.printStackTrace();}}}/*** 死循环模拟StackOverflowError*/public static void callRecursiveMethod() {callRecursiveMethod();}}

未发生Stack Overflow之前
在这里插入图片描述
发生Stack Overflow之后
在这里插入图片描述

从输入日志也可以验证这一点:
在这里插入图片描述

参考:
https://blog.csdn.net/u011983531/article/details/79563162

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

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

相关文章

Web网络安全-----Log4j高危漏洞原理及修复

系列文章目录 Web网络安全-----红蓝攻防之信息收集 文章目录 系列文章目录什么是Log4j?一、Log4j漏洞二、漏洞产生原因1.什么是Lookups机制2.怎么利用JNDI进行注入JNDI简介LADPRMI 三、Log4j漏洞修复总结 什么是Log4j? Log4j 即 log for java(java的日…

开源可观测性平台Signoz(四)【链路监控及数据库中间件监控篇】

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 前文链接: ​​开源可观测性平台Signoz系列(一)【开篇】​​ ​​开源可观测性平台Signoz&…

设计模式之初始设计模式和UML图

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

S7.Net与西门子PLC通讯

开发环境准备 同时由于设备还未采购,没有设备进行测试开发,会安装一个仿真模拟器进行调试。(真心的,谁想到还能仿真模拟设备) 需要安装的软件包括 ◦TIA Portal V14 ◦S7-PLCSIM V14 ◦NetToPLCsim-S7o-v-1-2-2-0 TIA Portal 西门子官方管理设备数据块的客户端,每一…

25、WEB攻防——通用漏洞SQL读写注入MYSQLMSSQLPostgreSQL

文章目录 Mysql-root高权限读写注入PostgreSQL——dba高权限读写注入Mssql-sa高权限读写注入 Access无高权限注入点——只能猜解,而且是暴力猜解; MYSQL,PostgreSQL,MSSQL(SQL server)高权限注入点——可升级读写(文件…

记录DevEco Studio 模拟器启动失败问题

启动模拟器报错 解决步骤 1、“启用或关闭windows功能"勾选"hyper-v”、“windows虚拟机监控程序平台”、“虚拟机平台” 2、打开cpu虚拟化 打开bios,打开Intel Virtualization Technology 这样就可以了 在任务管理器可以看到已开启,编辑器…

Java基层医院信息化管理系统云HIS源码

医院信息系统(HIS)经历了从手工到单机再到局域网的两个阶段,随着云计算、大数据新技术迅猛发展,基于云计算的医院信息系统将逐步取代传统局域网HIS,以适应人们对医疗卫生服务越来越高的要求。 云HIS分系统功能 一、医疗业务子系统…

常用设计模式全面总结版(JavaKotlin)

这篇文章主要是针对之前博客的下列文章的总结版本: 《设计模式系列学习笔记》《Kotlin核心编程》笔记:设计模式【Android知识笔记】FrameWork中的设计模式主要为了在学习了 Kotlin 之后,将 Java 的设计模式实现与 Kotin 的实现放在一起做一个对比。 一、创建型模式 单例模…

word中MathType公式编号

直接上效果图: 步骤如下: 安装MathTypeword中安装MathType选项卡。设置MathType选项卡添加分隔符插入公式,自动生成右编码 接下来介绍每一步。 文章目录 1. 安装MathType2. Word中安装MathType选项卡3. 配置MathType选项4. 添加分隔符5. 插…

fiddler菜单汉化补丁

【Fiddler汉化补丁下载地址】 一、手机应用市场下载“头条搜索极速版”app 二、头条搜索极速版中搜索“葫芦娃指南”获取 三、汉化过程完整过程 1、安装Fiddler英文版 2、比如我将Fiddler安装在:D:\Programs\Fiddler 3、将【fiddler汉化】文件夹中的FiddlerT…

【Image】超硬核数学推导——WGAN的先“破”后“立”

GAN的实现 上一篇文章中我们说到了GAN的数学解释 min ⁡ G max ⁡ D V ( D , G ) E x ∼ p data ( x ) [ log ⁡ D ( x ) ] E z ∼ p z ( z ) [ log ⁡ ( 1 − D ( G ( z ) ) ) ] − log ⁡ 4 2 J S D ( p data ∥ p g ) ≥ − log ⁡ 4 , where [ p d a t a p g ] \mi…

SpringMVC源码解析——DispatcherServlet的逻辑处理

DispatcherServlet类相关的结构图如下: 其中jakarta.servlet.http.HttpServlet的父类是jakarta.servlet.GenericServlet,实现接口jakarta.servlet.Servlet。我们先看一下jakarta.servlet.Servlet接口的源码如下: /*** 定义所有servlet必须实…