当前位置: 首页 > news >正文

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.lryc.cn/news/270236.html

相关文章:

  • 基于DFA算法实现敏感词过滤
  • 模式识别与机器学习-无监督学习-聚类
  • Python中property特性属性是什么
  • vue3 全局配置Axios实例
  • EI级 | Matlab实现TCN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测
  • WeNet语音识别分词制作词云图
  • Proxyman:现代本地Web调试代理工具
  • k8s中DaemonSet实战详解
  • 信号处理设计模式
  • Linux权限的基本理解
  • AI人工智能大模型讲师叶梓《基于人工智能的内容生成(AIGC)理论与实践》培训提纲
  • nat地址转换
  • 第12课 循环综合举例
  • Tuxera NTFS for Mac2024免费Mac读写软件下载教程
  • C++ 具名要求
  • 大创项目推荐 深度学习二维码识别
  • C++初阶——基础知识(函数重载与引用)
  • 车载电子电器架构 —— 电子电气系统开发角色定义
  • 最新Redis7哨兵模式(保姆级教学)
  • Redis原理及常见问题
  • nvm 的安装及使用 (Node版本管理器)
  • 【Yii2】数据库查询方法总结
  • 区块链的三难困境是什么,如何解决?
  • oCPC实践录 | oCPM的秘密
  • 【Linux Shell学习笔记】Linux Shell的位置参数与函数
  • 缓存cache和缓冲buffer的区别
  • Vue常见面试问答
  • Eureka相关面试题及答案
  • 想要学会JVM调优,先掌握JVM内存模型和JVM运行原理
  • 详解C语言入门程序:HelloWorld.c