2015-04-06 59 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詢問的內容 –