2015-04-06 57 views
5

我最近接受了一次采访,并被要求设计/实现堆栈跟踪功能。这就是我想到的。如何在出现故障时执行堆栈跟踪?

  • 维护一个堆栈,它保存程序入口主要点的所有方法调用。
  • 如果在执行过程中的任何一点出错,停止程序并弹出每个元素来打印整个堆栈。

我当时问了两个问题:

  1. 如何/在哪里将这个堆栈初始化?
  2. 如果不运行OOM,您将如何决定堆栈应该存储多少数据?为什么JVM不运行堆栈的OOM原因?

对于我说的第一个问题,堆栈应该是一个静态的,应该在程序开始时初始化。但我不确定第二个问题。我尝试阅读JVM如何执行此操作,但它有点复杂。我试图用Google搜索基本实现,但找不到任何。非常感谢,如果有人会指出我正确的方向,我到底应该寻找什么来回答这个问题。

+0

可能重复的[Java默认堆栈大小](http://stackoverflow.com/questions/20030120/java-default-stack-size) – ControlAltDel

+1

看看Throwables printStackTrace() – user489041

+0

抱歉投票关闭,但我意识到这两个问题是不一样的。你可以在这个问题中找到关于堆栈分配的大量信息:http://stackoverflow.com/questions/20030120/java-default-stack-size – ControlAltDel

回答

0

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

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

无论如何,我的2¢。

0

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

问题是我不确定堆栈帧是否具有所需的全部信息。

0

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

+0

我不认为这是OP询问的内容 –