Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发生故障时如何实现堆栈跟踪?_Java - Fatal编程技术网

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

Java 发生故障时如何实现堆栈跟踪?,java,Java,我最近接受了一次采访,被要求设计/实现stacktrace功能。这就是我想到的 维护一个堆栈,该堆栈保存来自程序主要入口点的所有方法调用 如果在执行过程中的任何时候出现错误,请停止程序并通过弹出每个元素来打印整个堆栈 然后有人问了我两个问题: 如何/在何处初始化此堆栈 如果堆栈没有运行OOM,您将如何决定它应该存储多少数据?为什么JVM从来没有因为堆栈而运行OOM 对于我说的第一个问题,堆栈应该是静态的,并且应该在程序开始时初始化。但我不确定第二个问题。我试图了解JVM是如何做到这一点的,但

我最近接受了一次采访,被要求设计/实现stacktrace功能。这就是我想到的

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

  • 如何/在何处初始化此堆栈
  • 如果堆栈没有运行OOM,您将如何决定它应该存储多少数据?为什么JVM从来没有因为堆栈而运行OOM

  • 对于我说的第一个问题,堆栈应该是静态的,并且应该在程序开始时初始化。但我不确定第二个问题。我试图了解JVM是如何做到这一点的,但它有点复杂。我试着在谷歌上搜索基本的实现,但找不到。如果有人能给我指出正确的方向,让我知道我应该寻找什么来回答这个问题,我将不胜感激。

    这是一个开放式的问题,我的观点如下:

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

  • 无论如何,我的2×。

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


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

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

    可能与Look at Throwables printStackTrace()重复。抱歉,我投票决定关闭,但我意识到这两个问题不一样。通过这个问题,您可以找到很多关于堆栈分配的信息:如果您在某个时候需要堆栈跟踪,最简单的方法是在那里抛出并捕获异常,然后从异常中获取堆栈跟踪。@user489041我想这并没有给您OP要找的信息
    printStackTrace()
    只是使用
    getStackTrace()
    并对其进行格式化。我认为这不是OP所要求的