我有一個需求,在我的應用程序中支持很多處理正在發生,在某個時間點發生異常,這是由於對象引起的。現在我想知道這個對象的整個歷史。我的意思是在應用程序啓動後的一段時間內發生的任何事情。如何獲取對象的歷史記錄或跟蹤對象
這是偷窺到這個對象的歷史可能通過使用JMX或其他任何東西?
感謝
我有一個需求,在我的應用程序中支持很多處理正在發生,在某個時間點發生異常,這是由於對象引起的。現在我想知道這個對象的整個歷史。我的意思是在應用程序啓動後的一段時間內發生的任何事情。如何獲取對象的歷史記錄或跟蹤對象
這是偷窺到這個對象的歷史可能通過使用JMX或其他任何東西?
感謝
這是不可能的,標準的Java(或其他編程語言我所知道的)。您應該爲應用程序添加足夠的日誌記錄,以便您瞭解發生的情況。另外,如果您還不知道如何使用IDE的調試器,請學習如何使用。
一句話:沒有
用幾句話:
的JVM不保留任何歷史過去的當前狀態的任何物體上,除了有關垃圾收集和信息很少也許是HotSpot優化器需要的一些方法調用指標。否則會暗示龐大的處理和內存開銷。還有一個粒度問題;你只記錄字段更改嗎?每個方法調用?方法調用期間的每個CPU指令? JVM簡單地採取了簡單的方法,並沒有執行上述任何操作。
您必須隔離該對象的類和/或特定實例以及您自己需要的任何操作。您可能必須手動執行此操作 - 我還沒有找到允許我在運行時插入日誌記錄代碼的字節碼設備庫...
或者,您可能可以使用工具分析器,但要做好準備對於巨大的性能會下降。
我一般都認同@thkala和@artbristol(兩者皆爲+1)。
但是你有一個要求,沒有選擇:你需要一個解決方案。 我建議您嘗試使用執行審計的動態代理來包裝對象,即編寫發生在對象上的所有更改。
你可以使用AspectJ來做這件事。該方面將注意調用了哪種方法以及發送的參數是什麼。您還可以使用其他較低級別的工具,例如Javasist或CgLib。
答案是No
.JVM不mainatain對象state.Maximum的歷史你能做什麼,你可以跟蹤你的對象的狀態,可能是一些地方in-memory
,當你得到的異常,你可以序列化IN-記憶對象,然後我認爲你可以做分析。
它被稱爲'日誌記錄'。 – EJP