Как я могу найти количество живых объектов на "куче" в программе Java?
Есть хак, который вы можете попробовать:
см. эту (старую) статью для примера.
Вероятно, есть более эффективные способы сделать это с помощью JPDA или JMX , но я не нашел, как ...
jmap - это стандартная утилита Java, которую можно использовать для сбора дампов кучи и статистики. Я не могу сказать, какой протокол используется jmap для подключения к JVM для получения этой информации, и неясно, доступна ли эта информация программе, работающей в JVM напрямую (хотя я уверен, что программа может запрашивать ее JVM через какой-нибудь сокет, чтобы получить эту информацию).
JVM TI - это инструментальный интерфейс, используемый кодом C, и он имеет практически полный доступ к происходящему в JVM, но это код C и не доступен напрямую JVM. Вы, вероятно, могли бы написать C lib, а затем взаимодействовать с ней, но ничего из коробки не существует.
Существует несколько компонентов JMX MBean, но я не думаю, что какой-либо из них обеспечивает фактическое количество объектов. Однако вы можете получить статистику памяти из них (это то, что использует JConsole). Ознакомьтесь с классами java.lang.management.
Если вы хотите что-то быстрое (легко реализовать, не обязательно быстрый результат, поскольку jmap занимает некоторое время), я бы отключил запуск jmap и просто прочитал полученный файл.
Насколько я знаю, вы не можете. Однако вы можете узнать объем памяти, используемый для программы:
Runtime rt = Runtime.getRuntime();
System.out.println("Used: " + (rt.totalMemory() - rt.freeMemory());
System.out.println("Free: " + rt.freeMemory());
System.out.println("Total: " + rt.totalMemory());
.divouter:parent
-121--4213354- Я думаю, что вам нужен метод «after ()»:
$('input.test3').focus(function() {
$(this).closest('div.divouter').after('<div>Hi!</div>');
});
-121--4213355- Если все ваши объекты созданы с помощью какого-то класса Factory
, вы можете найти количество объектов в куче. Даже в этом случае необходимо использовать метод finalize ()
. Конечно, это не может быть сделано для всех объектов, например, классы библиотеки jdk не могут быть изменены. Но если вы хотите найти количество экземпляров определенного класса, вы можете найти это.
Для отладки вы можете использовать профилировщик (например, YourKit, коммерческий профилировщик java). Вы найдете как профилировщики Java с открытым исходным кодом, так и коммерческие варианты.
Для интеграции с вашим кодом вы можете использовать технику «аспектно-ориентированного программирования». Фреймворки АОП (например, AspectWerkz) позволяют изменять файлы классов во время загрузки класса. Это позволит вам изменять конструкторы для регистрации объектов в вашей «среде всех-моих-выполнения-объектов».