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