我有一个需求,在我的应用程序中支持很多处理正在发生,在某个时间点发生异常,这是由于对象引起的。现在我想知道这个对象的整个历史。我的意思是在应用程序启动后的一段时间内发生的任何事情。如何获取对象的历史记录或跟踪对象
这是偷窥到这个对象的历史可能通过使用JMX或其他任何东西?
感谢
我有一个需求,在我的应用程序中支持很多处理正在发生,在某个时间点发生异常,这是由于对象引起的。现在我想知道这个对象的整个历史。我的意思是在应用程序启动后的一段时间内发生的任何事情。如何获取对象的历史记录或跟踪对象
这是偷窥到这个对象的历史可能通过使用JMX或其他任何东西?
感谢
这是不可能的,标准的Java(或其他编程语言我所知道的)。您应该为应用程序添加足够的日志记录,以便您了解发生的情况。另外,如果您还不知道如何使用IDE的调试器,请学习如何使用。
一句话:没有
用几句话:
的JVM不保留任何历史过去的当前状态的任何物体上,除了有关垃圾收集和信息很少也许是HotSpot优化器需要的一些方法调用指标。否则会暗示庞大的处理和内存开销。还有一个粒度问题;你只记录字段更改吗?每个方法调用?方法调用期间的每个CPU指令? JVM简单地采取了简单的方法,并没有执行上述任何操作。
您必须隔离该对象的类和/或特定实例以及您自己需要的任何操作。您可能必须手动执行此操作 - 我还没有找到允许我在运行时插入日志记录代码的字节码设备库...
或者,您可能可以使用工具分析器,但要做好准备对于巨大的性能会下降。
我一般都认同@thkala和@artbristol(两者皆为+1)。
但是你有一个要求,没有选择:你需要一个解决方案。 我建议您尝试使用执行审计的动态代理来包装对象,即编写发生在对象上的所有更改。
你可以使用AspectJ来做这件事。该方面将注意调用了哪种方法以及发送的参数是什么。您还可以使用其他较低级别的工具,例如Javasist或CgLib。
答案是No
.JVM不mainatain对象state.Maximum的历史你能做什么,你可以跟踪你的对象的状态,可能是一些地方in-memory
,当你得到的异常,你可以序列化IN-记忆对象,然后我认为你可以做分析。
它被称为'日志记录'。 – EJP