Как я могу получить количество экземпляров произвольного класса? - PullRequest
2 голосов
/ 15 декабря 2009

Учитывая класс (например: foo.bar.MyClass), как я могу получить количество экземпляров этого класса, существующих в JVM?

Спасибо

РЕДАКТИРОВАТЬ: Я ищу код, который будет получать этот счет.

РЕДАКТИРОВАТЬ: более конкретно, реализация метода Integer getInstanceCount(Class c)

Ответы [ 3 ]

5 голосов
/ 15 декабря 2009

Есть три или даже четыре возможных ответа в зависимости от точного контекста. Вот они:

  1. Если вы можете изменить исходный код класса, тогда вы можете добавить статический счетчик (см. @The Feast's answer)

  2. Если у вас проблемы с памятью, вам следует использовать профилировщик памяти (см. @ WinSharp93), например: http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html,

  3. Если у вас нет доступа к исходному коду, вы можете зарегистрировать инструментальный агент в JVM, который вставит это статическое поле в интересующие вас классы (не тривиально, но возможно). Учебное пособие по приборостроению доступно здесь: http://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html

  4. Если вы искали какой-нибудь Java API, который предоставляет эту информацию, то, к сожалению, ответ таков: такая возможность не поддерживается.

2 голосов
/ 15 декабря 2009

Если вы хотите знать это по причинам отладки / оптимизации: Найдите профилировщик памяти .

1 голос
/ 15 декабря 2009

Вы можете использовать статический атрибут для измерения экземпляров классов в виртуальной машине:

static int noOfInstances = 0;

Увеличивать каждый новый экземпляр в конструкторе с:

noOfInstances++;

Или используйте инициализатор экземпляра:

{ noOfInstances++; }

Уменьшение при завершении объекта.

void finalize() {
    noOfInstances--;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...