是否有一种简单的方法可以在Java中获取特定类的所有对象实例

目前我正在使用Java代理来组装内存统计信息。 在instrumentation API的帮助下,我可以掌握类(并操纵它们)。 使用普通Java,我可以估计每个对象使用的资源。 到现在为止还挺好。

我现在面临的问题是“如何掌握特定类的每个Object实例”。 我可以进行字节代码操作以获取对象实例,但我希望有另一个我不知道的API,帮助我在没有如此沉重的侵入性步骤的情况下实现我的目标。 最后,应将性能影响保持在最低限度。 有任何想法吗?

当我读到这篇文章时,我认为必须有一些方法来获取这种信息,因为存在java分析器。 也许这会有所帮助: http : //java.sun.com/j2se/1.4.2/docs/guide/jvmpi/jvmpi.html 。 它描述了JVM和探查器代理之间的接口。 但如果你真的想用Java写这个,你可能会运气不好。

具体来说,看看这个function:

 jint (*EnableEvent)(jint event_type, void *arg); Called by the profiler agent to enable notification of a particular type of event. Apart from event_type, the profiler may also pass an argument that provides additional information specific to the given event type. All events are disabled when the VM starts up. Once enabled, an event stays enabled until it is explicitly disabled. This function returns JVMPI_NOT_AVAILABLE if event_type is JVMPI_EVENT_HEAP_DUMP, JVMPI_EVENT_MONITOR_DUMP or JVMPI_EVENT_OBJECT_DUMP. The profiler agent must use the RequestEvent function to request these events. Arguments: event_type - type of event, JVMPI_EVENT_CLASS_LOAD etc. arg - event specific argument. Returns: JVMPI_SUCCESS enable succeeded. JVMPI_FAIL enable failed. JVMPI_NOT_AVAILABLE support for enabling the given event_type is not available. 

http://java.sun.com/j2se/1.5.0/docs/guide/jvmti/jvmti.html#IterateOverInstancesOfClass

您可以编写一些获取JVMTI指针的本机代码,然后使用它来迭代给定类的所有实例,如上面的链接所示。 您可以从Java程序中调用此本机代码。 正如Eli指出的那样,从Java 6开始,这个称为Java调试接口的高级包装器允许您从Java本身进行此类调用,而无需使用本机代码。

希望这可以帮助

内存

我想知道你尝试做什么可能是用BTrace完成的?

从以前的post中我所说的,没有办法获得Java中所有类的实例列表。 reflectionAPI做了一些巧妙的事情,但没有这个特定的东西。

你可以做的最好的事情是保持指向所有对象的指针,但这似乎是淫秽的,并不适用于其他人的程序。 不太理想啊?