Java 如何获取对象的历史记录或跟踪对象

Java 如何获取对象的历史记录或跟踪对象,java,exception-handling,stack-trace,jmx,jconsole,Java,Exception Handling,Stack Trace,Jmx,Jconsole,我有一个需求,在我的应用程序中支持大量的处理正在发生,在某个时间点由于一个对象而出现异常。现在我想知道这个物体的全部历史。我的意思是,在应用程序启动后的一段时间内,该对象发生了什么 这种窥视对象历史的方式是否可能通过JMX或其他方式实现 谢谢这在标准Java(或我所知道的任何其他编程语言)中是不可能的。您应该在应用程序中添加足够的日志记录,这将允许您了解发生了什么。另外,如果您还不知道如何使用IDE的调试器,请学习使用它。一句话:不 再多说几句: JVM不会在任何对象上保留超过其当前状态的任何历

我有一个需求,在我的应用程序中支持大量的处理正在发生,在某个时间点由于一个对象而出现异常。现在我想知道这个物体的全部历史。我的意思是,在应用程序启动后的一段时间内,该对象发生了什么

这种窥视对象历史的方式是否可能通过JMX或其他方式实现


谢谢

这在标准Java(或我所知道的任何其他编程语言)中是不可能的。您应该在应用程序中添加足够的日志记录,这将允许您了解发生了什么。另外,如果您还不知道如何使用IDE的调试器,请学习使用它。

一句话:不

再多说几句:

JVM不会在任何对象上保留超过其当前状态的任何历史记录,除了与垃圾收集相关的很少信息,以及热点优化器可能需要的一些方法调用度量。否则将意味着巨大的处理和内存开销。还有粒度的问题;是否只记录字段更改?每个方法调用?方法调用期间的每个CPU指令?JVM只是采取了简单的方法,不做上述任何事情

您必须隔离该对象的类和/或特定实例,并自行记录所需的任何操作。您可能必须手动执行此操作-我还没有找到允许我在运行时插入日志代码的字节码插装库


或者,您也可以使用插入式探查器,但在这样做时要做好性能大幅下降的准备。

我通常同意@thkala和@artbristol(+1)

但你有一个要求,别无选择:你需要一个解决方案。 我建议您尝试使用执行审计的动态代理来包装您的对象,即写入发生在对象上的所有更改


您可能可以为此使用AspectJ。方面将注意调用了什么方法以及发送了什么参数。您也可以使用其他较低级别的工具,例如Javasist或CgLib。

答案是
。JVM在对象状态的历史记录中不存在。最大限度地,您可以跟踪对象的状态,这些状态可能在内存中
的某个位置,当出现异常时,您可以序列化内存中的对象,然后我认为您可以进行分析

字节码生成库需要大量的工作来插入日志代码——通常只需将日志语句手动添加到相关类的源代码中就更容易了。不过,我将+1 AOP建议,尽管存在w.r.t.在现有代码库中集成AspectJ的问题…@thkala,你是对的,这是冗长的,但只有在使用低级API的情况下。我和Javassist一起工作。它允许创建动态代理(与JDK中的代理完全相同,但可以包装类,而不仅仅是接口)。这就像使用常规反射编写代码一样简单。AspectJ是简化这一点的又一个步骤。