Java 发生故障时如何实现堆栈跟踪?
我最近接受了一次采访,被要求设计/实现stacktrace功能。这就是我想到的Java 发生故障时如何实现堆栈跟踪?,java,Java,我最近接受了一次采访,被要求设计/实现stacktrace功能。这就是我想到的 维护一个堆栈,该堆栈保存来自程序主要入口点的所有方法调用 如果在执行过程中的任何时候出现错误,请停止程序并通过弹出每个元素来打印整个堆栈 然后有人问了我两个问题: 如何/在何处初始化此堆栈 如果堆栈没有运行OOM,您将如何决定它应该存储多少数据?为什么JVM从来没有因为堆栈而运行OOM 对于我说的第一个问题,堆栈应该是静态的,并且应该在程序开始时初始化。但我不确定第二个问题。我试图了解JVM是如何做到这一点的,但
- 维护一个堆栈,该堆栈保存来自程序主要入口点的所有方法调用
- 如果在执行过程中的任何时候出现错误,请停止程序并通过弹出每个元素来打印整个堆栈
对于我说的第一个问题,堆栈应该是静态的,并且应该在程序开始时初始化。但我不确定第二个问题。我试图了解JVM是如何做到这一点的,但它有点复杂。我试着在谷歌上搜索基本的实现,但找不到。如果有人能给我指出正确的方向,让我知道我应该寻找什么来回答这个问题,我将不胜感激。这是一个开放式的问题,我的观点如下:
无论如何,我的2×。我不会在任何地方存储任何堆栈跟踪信息,因为它已经存储在每个线程的堆栈框架中。当需要堆栈跟踪时(例如抛出异常),我会从堆栈框架构建它
问题是我不确定堆栈框架是否具有执行此操作所需的所有信息。调用Thread.currentThread().getStackTrace()以返回可以打印到日志中的StackElement[]。可能与Look at Throwables printStackTrace()重复。抱歉,我投票决定关闭,但我意识到这两个问题不一样。通过这个问题,您可以找到很多关于堆栈分配的信息:如果您在某个时候需要堆栈跟踪,最简单的方法是在那里抛出并捕获异常,然后从异常中获取堆栈跟踪。@user489041我想这并没有给您OP要找的信息
printStackTrace()
只是使用getStackTrace()
并对其进行格式化。我认为这不是OP所要求的