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

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

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

4b9b3361

Ответ 1

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

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

см. эту (старую) статью для образца.

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

Ответ 2

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

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

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

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

Ответ 3

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

enter image description here

Ответ 4

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

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

Total 2802946 174459656

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

Ответ 5

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

 Runtime rt = Runtime.getRuntime();
 System.out.println("Used: " + (rt.totalMemory() - rt.freeMemory());
 System.out.println("Free: " + rt.freeMemory());
 System.out.println("Total: " + rt.totalMemory());

Ответ 6

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

Ответ 7

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

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

Ответ 8

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 
    }
}

Ответ 9

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();
  }
}

Ответ 10

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();

    }

}