Как найти количество объектов в "куче"

Как я могу найти количество живых объектов на "куче" в программе Java?

20
задан Michael Petrotta 14 February 2010 в 20:27
поделиться

5 ответов

Есть хак, который вы можете попробовать:

  • создать свой собственный java.lang.Object (скопировать исходный источник)
  • подсчитать количество созданных объектов в конструкторе (не вызывается для массивов)
  • добавьте путь к вашему файлу класса в загрузочный путь к классам

см. эту (старую) статью для примера.

Вероятно, есть более эффективные способы сделать это с помощью JPDA или JMX , но я не нашел, как ...

5
ответ дан 30 November 2019 в 00:43
поделиться

jmap - это стандартная утилита Java, которую можно использовать для сбора дампов кучи и статистики. Я не могу сказать, какой протокол используется jmap для подключения к JVM для получения этой информации, и неясно, доступна ли эта информация программе, работающей в JVM напрямую (хотя я уверен, что программа может запрашивать ее JVM через какой-нибудь сокет, чтобы получить эту информацию).

JVM TI - это инструментальный интерфейс, используемый кодом C, и он имеет практически полный доступ к происходящему в JVM, но это код C и не доступен напрямую JVM. Вы, вероятно, могли бы написать C lib, а затем взаимодействовать с ней, но ничего из коробки не существует.

Существует несколько компонентов JMX MBean, но я не думаю, что какой-либо из них обеспечивает фактическое количество объектов. Однако вы можете получить статистику памяти из них (это то, что использует JConsole). Ознакомьтесь с классами java.lang.management.

Если вы хотите что-то быстрое (легко реализовать, не обязательно быстрый результат, поскольку jmap занимает некоторое время), я бы отключил запуск jmap и просто прочитал полученный файл.

12
ответ дан 30 November 2019 в 00:43
поделиться

Насколько я знаю, вы не можете. Однако вы можете узнать объем памяти, используемый для программы:

 Runtime rt = Runtime.getRuntime();
 System.out.println("Used: " + (rt.totalMemory() - rt.freeMemory());
 System.out.println("Free: " + rt.freeMemory());
 System.out.println("Total: " + rt.totalMemory());
0
ответ дан 30 November 2019 в 00:43
поделиться
.divouter:parent
-121--4213354-

Я думаю, что вам нужен метод «after ()»:

$('input.test3').focus(function() {
   $(this).closest('div.divouter').after('<div>Hi!</div>');
});
-121--4213355-

Если все ваши объекты созданы с помощью какого-то класса Factory , вы можете найти количество объектов в куче. Даже в этом случае необходимо использовать метод finalize () . Конечно, это не может быть сделано для всех объектов, например, классы библиотеки jdk не могут быть изменены. Но если вы хотите найти количество экземпляров определенного класса, вы можете найти это.

0
ответ дан 30 November 2019 в 00:43
поделиться

Для отладки вы можете использовать профилировщик (например, YourKit, коммерческий профилировщик java). Вы найдете как профилировщики Java с открытым исходным кодом, так и коммерческие варианты.

Для интеграции с вашим кодом вы можете использовать технику «аспектно-ориентированного программирования». Фреймворки АОП (например, AspectWerkz) позволяют изменять файлы классов во время загрузки класса. Это позволит вам изменять конструкторы для регистрации объектов в вашей «среде всех-моих-выполнения-объектов».

0
ответ дан 30 November 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: