2012-06-14 160 views
3

我有一個需求,在我的應用程序中支持很多處理正在發生,在某個時間點發生異常,這是由於對象引起的。現在我想知道這個對象的整個歷史。我的意思是在應用程序啓動後的一段時間內發生的任何事情。如何獲取對象的歷史記錄或跟蹤對象

這是偷窺到這個對象的歷史可能通過使用JMX或其他任何東西?

感謝

+0

它被稱爲'日誌記錄'。 – EJP

回答

1

這是不可能的,標準的Java(或其他編程語言我所知道的)。您應該爲應用程序添加足夠的日誌記錄,以便您瞭解發生的情況。另外,如果您還不知道如何使用IDE的調試器,請學習如何使用。

2

一句話:沒有

用幾句話:

的JVM不保留任何歷史過去的當前狀態的任何物體上,除了有關垃圾收集和信息很少也許是HotSpot優化器需要的一些方法調用指標。否則會暗示龐大的處理和內存開銷。還有一個粒度問題;你只記錄字段更改嗎?每個方法調用?方法調用期間的每個CPU指令? JVM簡單地採取了簡單的方法,並沒有執行上述任何操作。

您必須隔離該對象的類和/或特定實例以及您自己需要的任何操作。您可能必須手動執行此操作 - 我還沒有找到允許我在運行時插入日誌記錄代碼的字節碼設備庫...

或者,您可能可以使用工具分析器,但要做好準備對於巨大的性能會下降。

1

我一般都認同@thkala和@artbristol(兩者皆爲+1)。

但是你有一個要求,沒有選擇:你需要一個解決方案。 我建議您嘗試使用執行審計的動態代理來包裝對象,即編寫發生在對象上的所有更改。

你可以使用AspectJ來做這件事。該方面將注意調用了哪種方法以及發送的參數是什麼。您還可以使用其他較低級別的工具,例如Javasist或CgLib。

+0

字節碼生成庫需要大量的插腳來插入日誌代碼 - 通常只需手動將日誌語句添加到相關類的源代碼中就可以了。儘管存在w.r.t的問題,但我會對AOP建議+1。在現有的代碼庫中集成AspectJ ... – thkala

+0

@thkala,你說得對,這是冗長的,但只有當你使用低級別的API。我曾與Javassist合作。它允許創建動態代理(就像來自JDK的代理,但可以包裝類,而不僅僅是接口)。這與使用常規反射編寫代碼一樣簡單。AspectJ是簡化這個過程的又一步。 – AlexR

0

答案是No .JVM不mainatain對象state.Maximum的歷史你能做什麼,你可以跟蹤你的對象的狀態,可能是一些地方in-memory,當你得到的異常,你可以序列化IN-記憶對象,然後我認爲你可以做分析。