2012-06-14 109 views
3

我有一个需求,在我的应用程序中支持很多处理正在发生,在某个时间点发生异常,这是由于对象引起的。现在我想知道这个对象的整个历史。我的意思是在应用程序启动后的一段时间内发生的任何事情。如何获取对象的历史记录或跟踪对象

这是偷窥到这个对象的历史可能通过使用JMX或其他任何东西?

感谢

+0

它被称为'日志记录'。 – EJP

回答

1

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

2

一句话:没有

用几句话:

的JVM不保留任何历史过去的当前状态的任何物体上,除了有关垃圾收集和信息很少也许是HotSpot优化器需要的一些方法调用指标。否则会暗示庞大的处理和内存开销。还有一个粒度问题;你只记录字段更改吗?每个方法调用?方法调用期间的每个CPU指令? JVM简单地采取了简单的方法,并没有执行上述任何操作。

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

或者,您可能可以使用工具分析器,但要做好准备对于巨大的性能会下降。

1

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

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

你可以使用AspectJ来做这件事。该方面将注意调用了哪种方法以及发送的参数是什么。您还可以使用其他较低级别的工具,例如Javasist或CgLib。

+0

字节码生成库需要大量的插脚来插入日志代码 - 通常只需手动将日志语句添加到相关类的源代码中就可以了。尽管存在w.r.t的问题,但我会对AOP建议+1。在现有的代码库中集成AspectJ ... – thkala

+0

@thkala,你说得对,这是冗长的,但只有当你使用低级别的API。我曾与Javassist合作。它允许创建动态代理(就像来自JDK的代理,但可以包装类,而不仅仅是接口)。这与使用常规反射编写代码一样简单。AspectJ是简化这个过程的又一步。 – AlexR

0

答案是No .JVM不mainatain对象state.Maximum的历史你能做什么,你可以跟踪你的对象的状态,可能是一些地方in-memory,当你得到的异常,你可以序列化IN-记忆对象,然后我认为你可以做分析。