定位生产问题时,异常堆栈莫名丢了,何解?

FreeRTOS安全机制深度解析:从MPU任务隔离到堆栈溢出检测 实时操作系统(RTOS)在嵌入式设备中广泛应用,但随着设备联网和功能安全要求提升,系统安全性成为不可回避的议题。FreeRTOS作为轻量级内核,其安全保障并非单一机制,而是依赖Cortex-M处理器特权级模式与内存保护单元(MPU)的硬件隔离,配合任务管理、队列通信、堆栈溢出检测等软件策略共同实现。理解这些原理,有助于开发者在进行FreeRTOS移植时合理配置内核,并在集成LwIP协议栈或FreeModbus通信时规避共享资源竞争、中断抢占等风险。通过任务隔离、静态内存分配、溢出钩子与断言机制,可以显著提升 阅读详情

今天分享的这个知识有点冷,相信很多 Java 程序员很少遇到,废话不多说,直接进入排查问题的真实讨论现场。

小   猿:有个 NPE 异常,有空帮忙看看是哪里出的?

架构狮:我没有看到空指针堆栈啊!?

小   猿:有堆栈我就自己找问题了,就不劳驾您老啦(捂嘴笑)。

架构狮:是不是 NPE 报了好多次?

小   猿:是。

架构狮:一猜就是,因为只有报了很多次,Java 才会自动不打印异常堆栈信息(言外之意:报了多了 java 会省略的),那就找找最开始报异常的日志,肯定会有堆栈信息的(哈哈,心里有谱啦),这种机制叫做 fast throw。

1

 异常堆栈信息丢了?  

只见 Java 攻城狮小猿傻傻的盯着业务日志,一脸呆萌... ...

[2020-08-15 00:00:00]: 668812118 Thread-8 [ERROR] payService:java.lang.NullPointerException

与其傻傻迷思,不妨直接来个现场说法,talk is cheap,show me the code,直接上代码。

/**
 * Fast Throw 知识点分享
 * @author 一猿小讲
 */
public class NPETest {
    public static void main(String[] args) {
        String msg = null;
        for (int i = 0; i < 1000000; i++) {
            try {
                // msg 为空,会出现空指针异常
                System.out.println(msg.length());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

程序刚开始跑的时候,程序输出是下面这样子的。

java.lang.NullPointerException
  at NPETest.main(NPETest.java:11)
... ... 
java.lang.NullPointerException
  at NPETest.main(NPETest.java:11)

一会儿的功夫,输出却变成下面这个样子,异常堆栈确实丢了。

java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException
java.lang.NullPointerException

架构狮:惊奇不?有没有匪夷所思。

小   猿:何解?

架构狮:这种现象就叫做 fast throw,是 Java 虚拟机的一个优化,如果发现代码同一个位置频繁抛出同一类型的异常时,异常堆栈信息就会被清空,那么速度就会非常快,就不用再额外分配内存。

到这儿,Java 攻城狮小猿,点了一根香烟,感觉受益颇深,不过却又陷入了沉思。

2

 Fast Throw 深入一点,又何妨?  

思考一:查问题也太不方面了,如何让异常堆栈信息展示呢?

首先要清楚,JVM 会默认开启 Fast Throw 优化。如果想关闭这个优化,通过配置 -XX:-OmitStackTraceInFastThrow 就可以。

接下来还是跑上面 NPETest 的例子,配置 VM 参数,一起操作一把。

IDEA 运行时指定参数:-XX:-OmitStackTraceInFastThrow。

控制台运行时指定参数:

java -XX:-OmitStackTraceInFastThrow NPETest
‍

效果很明显,异常堆栈信息一直坚挺到最后:

... ...
java.lang.NullPointerException
        at NPETest.main(NPETest.java:11)
java.lang.NullPointerException
        at NPETest.main(NPETest.java:11)
java.lang.NullPointerException
        at NPETest.main(NPETest.java:11)
‍

话又说来,如何再开启 fast throw 优化呢?

方式一:默认就是开启优化;
方式二:-XX:+OmitStackTraceInFastThrow

思考二:除了 NPE 异常,JVM 开启 fast throw 优化的异常还有哪些?

  • ArithmeticException

  • ArrayIndexOutOfBoundsException

  • ArrayStoreException

  • ClassCastException

烟味灭,酒过半,Java 攻城狮小猿彻底掌握了技巧,嘴角洋溢着笑容,此番操作不但解决了生产问题,而且又 get 一装逼技能... ...

3

 寄语写最后 

本次,主要对小猿在排查生产上遇到的一个匪夷所思的问题,作为基础进行展开,简单对 JVM 特定类型的异常的 fast throw 优化进行了解,希望对大家有帮助。

好了,本次就谈到这里,一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出原创精彩分享,敬请期待!

推荐阅读:

Java线程池深度揭秘

彻底搞懂 Java 线程池,干啥都不再发憷

Java程序跑的快,全要靠线程带

fastjson的这些坑,你误入了没?

真实|技术人员该如何站好最后一班岗?

Java 8 的这些特性,你知道吗?

改掉这些坏习惯,还怕写不出健壮的代码?(一)

改掉这些坏习惯,还怕写不出优雅的代码?(二)

改掉这些坏习惯,还怕写不出优雅的代码?(三)

改掉这些坏习惯,还怕写不出健壮的代码?(四)

改掉这些坏习惯,还怕写不出精简的代码?(五)

改掉这些坏习惯,还怕写不出精简的代码?(六)

Windows程序崩溃分析实战:从WCRASH转储文件定位内存访问违规 在Windows平台软件开发中,程序崩溃是影响稳定性的常见问题。当应用程序发生不可处理的严重错误时,系统会生成崩溃转储文件(Crash Dump),通常称为WCRASH,它记录了崩溃瞬间的进程内存状态、寄存器值和线程堆栈等关键信息。通过分析这个“黑匣子”,开发者可以还原事故现场,定位引发崩溃的代码行和内存地址。这项技术的核心价值在于解决那些难以复现的偶发性崩溃,特别是在生产环境中,当应用程序日志信息缺失或来不及记录时,转储文件成为诊断问题的关键依据。在应用场景上,它广泛用于分析用户上报的崩溃问题、监控Win 阅读详情

相关推荐

避坑指南:.NET MAUI页面跳转最常见的5个坑点及解决方案(2023最新版)

本文深入剖析.NET MAUI开发中页面跳转的5个常见问题,包括参数丢失、导航堆栈崩溃、模态窗口关闭失效等,并提供工业级解决方案。特别针对.NET MAUI的跨平台特性,详细讲解了如何避免序列化陷阱、处理生命周期冲突以及统一不同平台的导航栏表现,帮助开发者高效避坑。

weixin_30687051的博客 396

FreeRTOS任务堆栈溢出?别慌,手把手教你用CubeMX的vApplicationStackOverflowHook快速定位问题

本文详细介绍了FreeRTOS任务堆栈溢出的诊断与解决方案,重点讲解了如何使用CubeMX的vApplicationStackOverflowHook快速定位问题。通过实战案例和优化策略,帮助开发者有效预防和解决堆栈溢出问题,提升嵌入式系统的稳定性。

weixin_30647065的博客 433

Linux调试神器strace的5个实战技巧:从程序崩溃到性能瓶颈定位

本文深入解析Linux调试工具strace的五大实战技巧,涵盖从程序崩溃逆向定位到性能瓶颈分析。通过捕获崩溃前系统调用、量化调用开销、追踪网络连接异常等场景,结合具体命令示例,帮助开发者高效诊断文件权限、性能劣化及网络通信等复杂问题,提升系统级调试能力。

weixin_29240343的博客 183

JVM的FastThrow优化机制

前一阵子,在公司排查线上问题发现:出问题的方法报空指针异常,但是没有异常堆栈信息和Message。我一开始以为是代码中做了处理,但是经过翻阅代码发现不是。最后一番查找资料,这种现象是JVM的一种优化机制,叫做FastThrow机制。

hanxiaozhang的博客 2139

人工智能机器学习从入门到高级学习资料(含资料下载地址)

机器学习是一个技术含量较高的领域,高效学习需要多种途径相结合.以下是一些推荐的学习资源。首先介绍几个比较有用的社区,包含了丰富的学习资料

2401_86900375的博客 1647

抖音直播“卡黑屏”技术解析:从实现原理到平台风控与合规运营

在直播技术领域,视频流推送与实时互动是核心基础。其原理在于通过编码软件(如OBS)将音视频数据封装后,经由网络协议推送到服务器,再分发给观众。这项技术的价值在于支撑了实时、高并发的在线互动场景,是直播、在线会议等应用的基石。然而,在追求流量和互动的实践中,衍生出一些非常规操作,例如通过技术手段中断或控制视频流推送,仅保留音频和互动功能,以达到特定运营目的。这便涉及到了**卡黑屏**这一具体现象。它本质上是对直播流的人为干预,常与**流量博弈**和**风险规避**等动机相关联。从工程实践角度看,实现方式多样,

weixin_29895109的博客 1293

JVM的fast throw机制

前言 今天在学习的时候看到Mentor有在提醒大家不要在代码中习惯性抛出NullPointerException,因为有时候不好查询异常来源,我:奥特曼扣了扣脑袋… Fast Throw 在他们的聊天中我看到了fast throw机制,于是求助了度娘。。。 HotSpot VM有个许多人觉得“匪夷所思”的优化,叫做fast throw:有些特定的隐式异常类型(NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、Arit

weixin_44212383的博客 791

从HPPC测试到Simulink仿真:锂电池二阶RC模型参数辨识完整流程

本文详细介绍了从HPPC测试到Simulink仿真的锂电池二阶RC模型参数辨识完整流程。通过HPPC测试获取实验数据,利用Simulink的Parameter Estimation工具进行参数辨识和模型验证,为BMS算法开发提供精确的电池模型。文章涵盖测试设计、数据预处理、模型搭建及工程应用等关键步骤,助力新能源电池研发。

whisky的博客 683

线上故障排查之异常的堆栈信息怎么突然就不见了

上周四,线上环境突然疯狂告警,我手机一直滴滴滴滴响个不停 这是一开始看到的告警信息,目测能看出可能是依赖的产品服务出问题了 等我打开电脑一看时,发现告警邮件又变成下面的样子 就只有一个空指针,啥堆栈都没有了(这我就有点懵逼了,大晚上12点,要是不是别人的问题把别人喊起来这不太好) 今天又发过版本,先镜像回滚吧,这样稳妥点(前提得确定新发布的代码,确认回滚不会出问题) 回滚完之后发现告警还在,那么就只能找产品的同学起来看了,结果已联系发现产品那边已经发现自己出问题了 后来服务是恢复了,但是

佛系程序员的野蛮之道 1174

Echocardiography Image Segmentation: A Survey(超声心动图图像分割方法综述--中文翻译)

Echocardiography Image Segmentation: A Survey 摘要:尽管超声图像的获取是较廉价,并且免于辐射的,但是超声图像因为信号衰减、斑点噪声等干扰,使得超声图像的分割具有较大挑战。本文将近些年应用于超声心动图像分割的相关方法进行了分类总结,并列出了10篇具有原创思想的文章,这些文章具有特殊的临床使用价值或是对于超声心动图像分割具有指导意义。 关键词:超声心动...

mrj4124的博客 5097

AMBA-CHI协议详解(七)

本节描述该协议包含的支持系统保序需求的机制。

Crazzy_M的博客 1158

异常堆栈日志打印方法

public static String getStackTrace(Throwable throwable) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw, true); throwable.printStackTrace(pw); ...

weixin_30401605的博客 179

LLaMA Factory多卡微调的实战教程(持续更新)

本文主要介绍了LLaMA Factory多卡微调的实战教程(持续更新),希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 2.3 模型选型与下载 2.4 配置多卡环境 3. 运行代码 3.1 构建训练数据 3.2 修改配置文件 3.3 微调 3.3.1 zero3微调 3.3.2 启动API 3.3.3 模型测试

herosunly的博客 25万+

消失的异常堆栈---jvm的fast throw

fast throw 简介 HotSpot VM有个许多人觉得“匪夷所思”的优化,叫做fast throw:有些特定的隐式异常类型(NullPointerException、ArithmeticException( / 0)之类)如果在代码里某个特定位置被抛出过多次的话,HotSpot Server Compiler(C2)会透明的决定用fast throw来优化这个抛出异常的地方——直接抛出一个...

what are you living for ? 1839

【硬件】LT3763中文手册

1)精确控制输入和输出电流;2) 3000:1真彩色PWM™调光;3) ±1.5%电压调节精度;4) ±6%电流调节精度;5)6V至60 V输入电压范围;6)宽输出范围最高可达55V;7)<2µA关断电流;8)用于负载电流热控制的控制引脚;9)输入和输出电流监控和限制;10)开路、短路和C/10故障检测;11)适用于LED应用的PWM驱动器输出;12)热增强型28引脚FE封装。

qq_39200110的博客 489

神经影像和人类基因组关联分析的实践过程

现代全脑转录图谱为研究脑组织的分子相关性提供了前所未有的机会,可以使用无创神经成像进行量化。然而,将神经影像学数据与转录组测量相结合并不是直截了当的,需要仔细考虑才能做出有效的推断。在本文中,我们回顾了最近的研究工作,探讨了不同的方法选择如何影响成像转录组学分析的三个主要阶段,包括1)转录图谱数据的处理;2)将转录测量与独立衍生的神经影像学表型相关联;3)通过基因富集分析评估鉴定的关联的功能意义。我们的目标是为这个快速发展的领域促进标准化和可复制方法的发展。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2201

打印异常堆栈_定位生产问题时,异常堆栈莫名丢了,何解?

今天分享的这个知识有点冷,相信很多 Java 程序员很少遇到,废话不多说,直接进入排查问题的真实讨论现场。小 猿:有个 NPE 异常,有空帮忙看看是哪里出的?架构师:我没有看到空指针堆栈啊!?小 猿:有堆栈我就自己找问题了,就不劳驾您老啦(捂嘴笑)。架构师:是不是 NPE 报了好多次?小 猿:是。架构狮:一猜就是,因为只有报了很多次,Java 才会自动不打印异常堆栈信息(言外之意:报了多了 jav...

weixin_29631169的博客 312

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Docker 容器突然退出、服务莫名重启:从 OOMKilled 到内存泄漏的生产排查手册

线上服务最怕“没有明显报错,却自己重启”。监控里只看到请求突然失败,容器列表里服务又重新起来了,应用日志可能只停在某一行,没有异常堆栈。这类问题里,Docker 容器被内存限制触发 OOMKilled,是很常见也很容易误判的一种。 这篇文章给一套生产可用的排查路径:先确认是不是 OOMKilled,再看容器限制、宿主机内存、内核日志和应用指标,最后给出临时止血、长期治理和发布前验证清单。适合部署 Web/API、爬虫任务、AI 推理服务、Java/Node

guojiyun1688的博客 242

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ML.NET 避坑指南:生产落地常见问题与解决方案

程序刚启动时内存正常,连续运行几天几夜后内存持续上涨,GC 也降不下来,最后触发 Full GC 导致卡顿,甚至 OOM 崩溃。工业上位机 7*24 小时运行场景尤其明显。ML.NET 的入门门槛很低,随便写几行就能跑通 Demo,但生产落地的门槛在工程化细节里。上面这些坑,几乎每个从 Demo 走向生产的团队都踩过一遍。本质上,这些问题都不是算法问题,而是软件工程问题。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 236

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

NAS系统日志分析:nas-tools异常检测实战指南

你是否还在为NAS媒体库频繁崩溃却找不到根源而烦恼?当Docker容器突然停止、网络连接莫名中断时,是否只能对着空白的日志文件束手无策?本文将系统讲解如何利用nas-tools内置日志系统实现异常检测,通过12个实战案例、7种分析工具和9套自动化脚本,帮你从日志数据中精准定位问题,构建稳定可靠的媒体库管理环境。 读完本文你将掌握: - 3分钟快速定位nas-tools常见错误的日志检索技巧 - ...

gitblog_00713的博客 1281

深入排查 .NET 空引用异常:自定义容器移除时的 NullReferenceException 实战指南

空引用异常是 .NET 开发中最常见的运行时错误之一,尤其在自定义容器移除场景中,NullReferenceException 往往隐藏得更深。理解其底层机制是解决问题的关键:当对象未被实例化时,任何成员访问都会触发 CLR 的保护机制,而容器移除涉及父子关系、事件订阅、数据绑定和异步竞态等多重复杂因素。本文从异常原理出发,系统讲解一套可复现的排查流程,包括开启异常设置、复现最小化实验、检查调用栈定位生命周期错位,并总结事件订阅未退订、枚举时修改集合、布局延迟操作等五大高频根因。结合 WPF 实际案例,提供

weixin_34218579的博客 414

头文件不匹配导致的崩溃问题

这里只是暂时

yuanhubilie的专栏 2439

Python生产环境10大隐形陷阱:从内存泄漏到缓存失效

Python作为动态语言,其简洁语法背后隐藏着大量运行时行为差异——这些差异在本地开发中难以暴露,却在高并发、内存受限、长周期运行的生产环境中引发OOM、线程阻塞、数据静默丢失等严重故障。核心问题源于对底层机制(如CPython对象生命周期、GIL调度、字节码执行路径)的理解断层。例如`with`语句的`__exit__`调用不确定性、`lru_cache`对可变依赖的快照式缓存、`range`误转`list`导致的内存爆炸,均属于‘可度量缺陷’:能被Prometheus指标捕获、ELK日志定位、Sentr

weixin_33507732的博客 252

系统黑化现象诊断与治理:从性能劣化到根因定位的实战指南

在分布式系统与微服务架构中,性能劣化、资源异常和错误率攀升是常见的工程挑战,其背后往往涉及复杂的技术债务累积与架构缺陷。理解系统可观测性(Observability)的核心原理,掌握从应用性能监控(APM)、链路追踪到日志聚合的诊断工具链,是定位线上问题的技术基础。通过构建完善的监控告警体系,开发者能够快速感知接口响应时间增长、内存泄漏或数据库查询劣化等异常信号。这些能力的价值在于提升系统稳定性、保障用户体验,并支撑高并发场景下的服务可靠性。本文聚焦于“系统黑化”这一典型工程困境,通过实战案例详解如何从性能

weixin_33933118的博客 446
上一篇: Java线程池深度揭秘
下一篇: 程序员进阶系列:你真的懂 HelloWorld 吗?
一猿小讲
博客等级 码龄15年 294粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值