Как найти количество объектов в куче - PullRequest
20 голосов
/ 14 февраля 2010

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

Ответы [ 10 ]

12 голосов
/ 14 февраля 2010

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

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

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

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

7 голосов
/ 16 мая 2015

Самый простой способ - использовать инструмент jmap. Если вы напечатаете гистограмму объектов в конце, вы увидите общее количество экземпляров, а также накопленный размер всех объектов:

jmap -histo <PID> напечатает целые объекты с количеством экземпляров и размером. Последняя строка будет содержать общее число

Total 2802946 174459656

Второй столбец - общее количество экземпляров, а последний - общее количество байтов.

7 голосов
/ 10 мая 2014

Используйте jvisualvm и создайте образец памяти. Он покажет количество классов и экземпляров:

enter image description here

5 голосов
/ 15 февраля 2010

Вы можете попробовать взломать:

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

см. Образец (старый) статью .

Возможно, есть лучшие способы сделать это, используя JPDA или JMX , но я не нашел, как ...

0 голосов
/ 09 декабря 2014
class Test1
{
    static int count=0;

    public Test1()
    {
        count++;
        System.out.println("Total Objects"+" "+count);
    }
}

public class CountTotalNumberOfObjects 
{

    public static void main(String[] args) 
    {
        Test1 t = new Test1();
        Test1 t1 = new Test1();
        Test1 t3 = new Test1();
        Test1 t11 = new Test1();
        Test1 t111 = new Test1();
        Test1 t13 = new Test1();

    }

}
0 голосов
/ 07 июля 2011
public class NumOfObjects {

    static int count=0;
    {
        count++;
    }
    public static void main(String[] args)
    {
        NumOfObjects no1=new NumOfObjects();
        System.out.println("no1:" + count);//1

        NumOfObjects no2=new NumOfObjects();
        System.out.println("no2:"+ count); //2
        for (int i=0; i<10;i++)
        {
            NumOfObjects noi=new NumOfObjects();    
        }
        System.out.println("Total objects:"+count);// 12 
    }
}
0 голосов
/ 18 февраля 2011
public class ObjectCount
{
  static int i;

  ObjectCount()
  {
    System.out.println(++i);
  }
  public static void main(String args[])
  {
    ObjectCount oc = new ObjectCount();
    ObjectCount od = new ObjectCount();
    ObjectCount oe = new ObjectCount();
    ObjectCount of = new ObjectCount();
    ObjectCount og = new ObjectCount();
  }
}
0 голосов
/ 14 февраля 2010

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

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

0 голосов
/ 14 февраля 2010

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

0 голосов
/ 14 февраля 2010

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

 Runtime rt = Runtime.getRuntime();
 System.out.println("Used: " + (rt.totalMemory() - rt.freeMemory());
 System.out.println("Free: " + rt.freeMemory());
 System.out.println("Total: " + rt.totalMemory());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...