Подтвердить что ты не робот

Есть ли простой способ получить все экземпляры объектов определенного класса в Java

В настоящее время я работаю над Java-агентом для сбора статистики памяти. С помощью инструментального API я могу овладеть классами (и манипулировать ими). С простой Java я могу получить оценку ресурсов, используемых для каждого объекта. Пока что так хорошо.

Вопрос, с которым я столкнулся прямо сейчас, - это "как удержать каждый экземпляр объекта определенного класса". Я могу выполнять манипуляции с байтовыми кодами, чтобы удержать экземпляр объекта, но я надеялся, что есть еще один API, о котором я не знаю, помогая мне достичь своей цели без такого довольно тяжелого навязчивого шага. В конце концов, влияние производительности должно быть сведено к минимуму. Любые идеи?

4b9b3361

Ответ 1

Отладчик в Eclipse может показать вам все экземпляры класса, поэтому я просмотрел источники Eclipse. Eclipse использует Java Debug Wire Protocol, который позволяет вам (начиная с Java 6) искать все экземпляры запрашиваемого класса. Если вы хотите пойти по этому пути, возьмите копию источников Eclipse и посмотрите instances метод org.eclipse.jdi.internal.ReferenceTypeImpl.

Более простой способ - использовать Java Debug Interface. Обратите внимание на метод ReferenceType.instances.

Я до сих пор не понял, как использовать JDI для подключения к запущенному процессу и как получить экземпляр ReferenceType. JDK содержит несколько examples, поэтому я уверен, что это выполнимо.

Ответ 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. 

Ответ 3

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

Вы можете написать собственный код, который получает указатель JVMTI, а затем использует его для итерации по всем экземплярам данного класса, как показано в приведенной выше ссылке. Вы можете вызвать этот собственный код из своей Java-программы. Тем не менее, как отмечает Эли, для этого называется Java Debug Interface, доступный с Java 6 и более поздний, который позволяет вам совершать такие вызовы от самой Java без необходимости гашения с помощью собственного кода.

надеюсь, что это поможет

Рама

Ответ 4

Интересно, можно ли выполнить то, что вы пытаетесь сделать, используя BTrace?

Ответ 5

Из того, что мне было сказано в предыдущих сообщениях, нет способа получить список всех экземпляров класса в Java. API отражения делает некоторые опрятные вещи, но не эту конкретную вещь.

Лучшее, что вы можете сделать, это удерживать указатели на все объекты, но это кажется непристойным и не работает на других программах людей. Не идеальный а?