размер Java-объекта - PullRequest
       11

размер Java-объекта

5 голосов
/ 07 ноября 2010

Как мы можем узнать размер Java-объекта ??

Пример:

class Person{
    String name;  
    int age;  

    public Person(String n, int a){  
        name = n;  
        age = a;  
    }
}  

Person person = new Person("Andy", 30);  

теперь, как я могу узнать размер объекта person ??

Спасибо

Ответы [ 6 ]

9 голосов
/ 07 ноября 2010

Вопрос не имеет смысла, по крайней мере, без дополнительного контекста.

Понятие "размер" в Java достаточно разумно определено для примитивов: байт 8-битный (неудивительно) int32-битный, long 64-битный и т. д. (см., например, http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html для полного списка).

Для экземпляров объекта это более сложно, потому что:

  • Экземпляры объектов могут (и обычно будут) содержать внутренние ссылки на другие экземпляры, поэтому вы должны решить, следует ли считать эти зависимые экземпляры и как.Что если несколько экземпляров имеют общую зависимость?
  • Иногда экземпляры объектов могут использоваться повторно (например, интернирование java.lang.String, см. http://en.wikipedia.org/wiki/String_interning).Поэтому, если вы используете x объектов размером y, общий размер может быть меньше, чем x * y
  • . В JVM есть много возможностей для внутренней реализации объектов и экземпляров.Он может использовать разные методы для разных экземпляров (например, совместное использование внутренних структур данных), поэтому может даже не быть значимого «размера» для назначения одному объекту.

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

Существуют некоторые практические правила для оценки кучи памяти, используемой экземплярами (например, в JVM Sun, экземпляр java.lang.Object использует 8 байт), но они будут зависеть от используемой вами JVM.использовать.

Как правило, если вы хотите узнать об использовании кучи, используйте профилировщик памяти / кучи.

Редактировать:

Ну, естьэто (начиная с JDK 6) способ получить приблизительное количество памяти, используемой объектом: http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize%28java.lang.Object%29

Это все еще только приближение ...

2 голосов
/ 07 ноября 2010

Я думаю, что вы можете получить что-то, что может вам помочь, если вы сделаете что-то вроде этого:

    /* First trigger classloading */
    MyObject delegate = new MyObject();

    Runtime.getRuntime().gc();

    long before = Runtime.getRuntime().freeMemory();
    MyObject delegate2 = new MyObject();
    long after = Runtime.getRuntime().freeMemory();

    System.out.println("Memory used:"+(before-after));

Надеемся, что это даст вам нужный ответ или хотя бы приблизительное значение.

1 голос
/ 03 декабря 2014

Вы можете использовать библиотеку sizeof4j для расчета размера любого объекта в java, например SizeOf.shallowSize(new Integer(2))

1 голос
/ 23 апреля 2013

EhCache предоставляет класс SizeOf , который будет пытаться использовать агент Instrumentation и будет использовать другой подход, если агент не загружен или не может быть загружен ( подробности здесь ).

Также см. агент из Хайнц Кабуц .

0 голосов
/ 14 августа 2012

Объекты.Чтобы определить использование памяти объектом, мы добавляем объем памяти, используемый каждой переменной экземпляра, к издержкам, связанным с каждым объектом, обычно 16 байтов.Накладные расходы включают ссылку на класс объекта, информацию о сборке мусора и информацию о синхронизации.Кроме того, использование памяти обычно дополняется кратным 8 байтам (машинным словам на 64-битной машине).Например, объект Integer использует 24 байта (16 байтов служебной информации, 4 байта для своей переменной экземпляра int и 4 байта заполнения)

Ссылка: http://www.amazon.com/Algorithms-4th-Edition-Robert-Sedgewick/dp/032157351X

0 голосов
/ 07 ноября 2010

В Java нет встроенного оператора sizeof.

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

Вы также можетеесть метод с именем sizeOf(), например:

// returns the size of this object in bytes
int sizeOf()
{
     int size = 0;
     size += name.Length * 2; // each character in name is 2 bytes, no?
     size += 4; // for n, which is 32 bits = 4 bytes
}

Обратите внимание, что эта реализация не включает в себя метаданные внутри имени, только количество байтов, необходимое для создания char[] для него.

...