堆栈跟踪 堆栈跟踪

我们最近在博客中发表的一篇评论带回了有关特定体验的一些回忆。 我希望我没有经历过的那种经历。 在创建Plumbr之前很长一段时间,我正在调试一个应用程序,该应用程序每次在蓝月亮时都会给我一个例外。 详细程度令人震惊:

java.lang.NullPointerException

就是这样–没有可使用的stacktrace。 而且该应用程序由一个真正邪恶的系统管理员保护着,他不允许我在部署后100码之内。 因此,为所有通宵人员准备了一个阶段,他们试图了解导致错误的原因。 我敢打赌,大多数读者都知道我在这里说什么。 第一个嫌疑犯是显而易见的。 暑期实习生从未真正获得过异常处理,并且可以轻松地吞下异常,而无需重新抛出或正确记录日志。 所以我期望在代码中的某处找到这样的东西:

System.out.println(e);

但是,无论我对源代码进行多彻底的检查 ,都找不到类似这种粗心大意的东西。 从第二天起,除了每隔几个小时接一个电话并提供“进度报告”,我就没有多少回忆。 不幸的是,进展遥遥无期。 除非我想尽一切努力对生产进行大量更新,以使他们对可能的原因有一些更有意义的尝试。 但是,我确实记得我开始怀疑自己一直认为不可能的事情时对测试Java的信念。 也就是说,Java能够从字面上吞噬您的Exception堆栈跟踪。 实际上,JIT可以并且将会做到。 需要证明吗? 运行以下代码:

for (int i = 0; i < 100_000; i++) {try {args[0].toString();} catch (Exception e) {if (e.getStackTrace().length == 0) {System.out.format("Java ate my stacktrace after iteration #%d %n", i);break;}}
}

在配备了最新稳定JDK 7热点的MB Pro中,异常堆栈跟踪在#12,288迭代中被吞噬。 但是为什么在地球上会发生这种情况,又如何避免呢? 简单的答案是它是运行时期间应用的JIT优化之一。 正如我们最近发表的一篇文章所描述的,创建Exceptions 非常昂贵 。 因此,出于性能目的,当JIT发现多次抛出异常时,可以重新编译代码。 重新编译后,编译器可以使用不提供堆栈跟踪的预分配异常来选择更快的策略。 希望你们中的绝大多数将永远不必处理这种情况。 毕竟,当以触发JIT切换到预分配的异常的速度创建异常时,您肯定在做其他错误。 毕竟,仅在例外情况下才应发生例外。 但是对于那些这样做的人,解决方案很简单。 您可以通过将-XX:-OmitStackTraceInFastThrow添加到JVM启动参数来禁用预分配的异常。 在下一次JVM重新启动后,我也找到了罪魁祸首。

参考: Plumbr Blog博客上的JCG合作伙伴 Nikita Salnikov Tarnovski 寻求丢失 堆栈跟踪的信息 。

翻译自: https://www.javacodegeeks.com/2013/09/on-a-quest-for-missing-stacktraces.html

堆栈跟踪 堆栈跟踪

堆栈跟踪 堆栈跟踪_寻找缺少的堆栈跟踪相关推荐

  1. 函数使用了堆栈的字节超过_单片机地址空间,堆栈理解

    data –可寻址片内ram 0x00-0x7f bdata-可位寻址片内ram idata-可寻址片内ram,允许访问全部内部ram 0x00-0xff padata-分页寻址访问片外ram xda ...

  2. 需求跟踪矩阵模板_大连电视台采用无跟踪虚拟技术升级多套节目

    大连电视台文体频道是以文体节目为内核.以娱乐为表现形态,文体频道的大众化专业频道.秉承"精彩生命,激情绽放"的理念,四大板块和大型活动共同构筑快乐的驿站.时尚的前沿.激情的核爆点. ...

  3. 极值跟踪算法 c语言,快速约束极值子空间跟踪算法_魏志强.pdf

    快速约束极值子空间跟踪算法_魏志强 34 4 Vol. 34 No. 4 第 卷第 期 华 北 水 利 水 电 学 院 学 报 2013 8 Journal of North China Instit ...

  4. 函数使用了堆栈的字节超过_在C语言中如何访问堆栈?

    堆栈一般是用来保存变量之类的东西(静态变量在内存中,虽然堆栈就是内存的一部分,但为了防止歧义,还是分成两部分来说),一般情况下没必要去故意读取堆栈的值,变量用变量名就可以直接访问,但我曾经想要读取函数 ...

  5. 轨迹跟踪主要方法_带你入门多目标跟踪(一)领域概述

    现在从目标检测和单目标跟踪方向转来做多目标跟踪的小伙伴应该有不少,但由于多目标跟踪任务本身的复杂性,导致其入门会比目标检测与单目标跟踪困难不少.再加上论文分布在各个会议,开源代码较少,都造成了多目标跟 ...

  6. python 堆栈溢出_内存 - 如何发生“堆栈溢出”,如何防止它?

    堆 在此上下文中,堆栈是在程序运行时放置数据的最后进先出缓冲区. 最后一次出来(LIFO)意味着你输入的最后一件事总是你要退回的第一件事 - 如果你在堆叠上推2个项目,'A'然后'B',那么你首先要弹 ...

  7. 【Android 应用开发】Activity 返回堆栈管理 ( 阶段总结 | 任务栈管理 | 返回堆栈 | 清除返回堆栈 | 亲和性 | 启动模式补充 | standard | singleTop )

    文章目录 一. 安卓应用任务栈管理 二. 任务与返回堆栈回顾 三. 返回堆栈清除 四. 关于亲和性回顾 五. Activity 启动模式 LaunchMode 补充 ( standard | sing ...

  8. 什么是Intel LBR(上次分支记录),BTS(分支跟踪存储)和AET(体系结构事件跟踪)?

    https://www.asset-intertech.com/resources/blog/2013/11/what-are-intel-lbr-bts-and-aet/ 艾伦·斯吉尼亚(Alan ...

  9. 强跟踪ukf matlab,一种改进的强跟踪UKF算法及其在SINS大方位失准角初始对准中的应用...

    近年来,对低成本.小型化捷联惯性导航系统(SINS)的需求日益增加,采用微机电系统(MEMS)惯性器件的SINS(MEMS-SINS)具有体积小.成本低.可靠性高.抗冲击能力强等优点,成为国内外惯性技 ...

最新文章

  1. 无限极分类原理与实现
  2. MMCME2_ADV介绍 高级混合模式时钟管理器(7 Series FPGA)
  3. Socket经验记录
  4. Visio画大括号、花括号
  5. 利用辗转相除法计算最大公约数
  6. 结合随机微分方程,多大Duvenaud团队提出无限深度贝叶斯神经网络
  7. Polynomial(2019南昌邀请赛)(拉格朗日插值)
  8. 第十期:快来了解这五种热门的开发技能
  9. mysql proxy 悲观锁_mysql悲观锁总结和实践
  10. [转载]Programming MS Office 2000 Web Components第二章第三节
  11. vue.3.0 dom赋值_Vue 3.0 快速入门
  12. java 获取属性值和设置属性值
  13. java铲车_深入研究Java类装载机制
  14. 移动端网页开发注意点
  15. C#环境下利用VS2017使用MapXtreme7.0.0开发桌面应用实例
  16. 解读2017年云计算发展趋势 — 简本
  17. 2020.04.10 【ABAP随笔】- ABAP面试分享
  18. 别问上海配眼镜去哪里好,这几家上海老店你必须知晓!
  19. 程序员如何在技术上提升自己
  20. mysql中sum和count的区别

热门文章

  1. Java中线程池,你真的会用吗
  2. Oracle入门(十四.11)之使用显式游标属性
  3. JsonData响应工具类封装
  4. MyBatis中增删改操作
  5. 2018蓝桥杯省赛---java---B---2(方格计数)
  6. JDBC连接数据库教程,postgreSQL
  7. python嵌套列表字典_python中嵌套列表转为字典
  8. 利用java求积分(定积分和无穷限积分)
  9. 快慢指针:141. 环形链表(判断是否存在环路)
  10. JavaWeb核心常用API一览