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

2022-09-02 09:44:11

目前,我正在开发一个Java代理来组装内存统计信息。在检测API的帮助下,我可以掌握这些类(并操纵它们)。使用普通的Java,我可以估计每个对象使用的资源。目前为止,一切都好。

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


答案 1

Eclipse 中的调试器可以向你显示一个类的所有实例,所以我查看了 Eclipse 的源代码。Eclipse使用Java Debug Wire Protocol,它允许您(从Java 6开始)查找所请求类的所有实例。如果你想走这条路,请获取Eclipse源代码的副本,并查看.instancesorg.eclipse.jdi.internal.ReferenceTypeImpl

更简单的方法是使用 Java 调试接口。请注意 ReferenceType.instances 方法。

我仍然不知道如何使用JDI连接到正在运行的进程以及如何获取.JDK包含几个示例,因此我确信它是可行的。ReferenceType


答案 2

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

具体来说,请查看此函数:

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. 

推荐