发生故障时如何实现堆栈跟踪?

时间:2015-04-06 16:47:22

标签: java

我最近接受了采访,并被要求设计/实现堆栈跟踪功能。这就是我想出来的。

  • 维护一个堆栈,该堆栈包含来自程序主要入口点的所有方法调用。
  • 如果在执行过程中的任何时候出现错误,请暂停程序并通过弹出每个元素来打印整个堆栈。
然后我被问到两个问题:

  1. 如何/在何处初始化此堆栈?
  2. 如果不运行OOM,您如何确定堆栈应存储多少数据?为什么JVM没有运行OOM导致堆栈?
  3. 对于我说的第一个问题,堆栈应该是静态的,应该在程序开始时初始化。但我不确定第二个问题。我试着看看JVM是如何做到的,但它有点复杂。我尝试谷歌搜索基本实现,但找不到任何。如果有人能指出我正确的方向来解决这个问题,我将非常感激。

3 个答案:

答案 0 :(得分:0)

这是一个开放式的问题,这是我的看法:

  1. 堆栈不应该是静态的 - 每个线程有一个堆栈,而不是每个程序,并且可以在程序的生命周期内添加和删除线程。所以堆栈也必须动态分配。
  2. Java堆栈可能会溢出。这可能与OOM不同,但没有那么不同。至于存储在堆栈中的内容 - 我可以使用用户配置,因为在开发与生产模式下运行时要求非常不同。您还可以讨论可能的堆栈管理改进,例如tail-call optimizations。这些可以防止堆栈溢出,但会影响编写代码的方式。
  3. 无论如何,我的2¢。

答案 1 :(得分:0)

我不会在任何地方存储任何堆栈跟踪信息,因为它已经存储在每个线程的堆栈帧中。当需要堆栈跟踪(例如抛出异常)时,我将从堆栈帧构建它。

问题是我不确定堆栈帧是否具有执行此操作所需的所有信息。

答案 2 :(得分:0)

调用Thread.currentThread()。getStackTrace()返回可以打印到日志中的StackElement []。