3

我有一个要求,在我的应用程序中支持大量处理,在某个时间点由于对象而发生异常。现在我想知道那个物体的整个历史。我的意思是自应用程序启动以来该对象在一段时间内发生的任何事情。

这是否可以通过使用 JMX 或其他任何方式来窥探 Object 的历史?

谢谢

4

4 回答 4

2

一句话:没有

再说几句:

JVM 不会保留任何对象过去其当前状态的任何历史记录,除了与垃圾收集相关的非常少的信息以及可能是 HotSpot 优化器所需的一些方法调用指标。否则将意味着巨大的处理和内存开销。还有粒度问题;你只记录字段更改吗?每个方法调用?方法调用期间的每条 CPU 指令?JVM 只是采取简单的方法,并且不执行上述任何操作。

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

或者,您也许可以使用检测分析器,但在这样做时要为性能大幅下降做好准备。

于 2012-06-14T09:28:51.303 回答
1

我一般同意@thkala 和@artbristol(两者都+1)。

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

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

于 2012-06-14T09:40:26.363 回答
1

这对于标准 Java(或我知道的任何其他编程语言)是不可能的。您应该为您的应用程序添加足够的日志记录,这将使您对发生的事情有所了解。此外,如果您还不知道如何使用,请学习使用 IDE 的调试器。

于 2012-06-14T09:27:41.817 回答
0

答案是No.JVM 不会维护对象状态的历史记录。您可以做的最大事情是您可以跟踪对象的状态,这些状态可能在某个地方in-memory和何时出现异常,您可以序列化该内存对象,然后我认为你可以做分析。

于 2012-06-14T09:44:04.307 回答