В Java, как лучше всего определить размер объекта? - PullRequest
568 голосов
/ 09 сентября 2008

Например, допустим, у меня есть приложение, которое может читать в CSV-файл с кучами строк данных. Я даю пользователю сводную информацию о количестве строк на основе типов данных, но хочу убедиться, что я не читаю слишком много строк данных и вызываю OutOfMemoryError s. Каждая строка переводится в объект. Есть ли простой способ узнать размер этого объекта программно? Есть ли ссылка, которая определяет, насколько велики примитивные типы и ссылки на объекты для VM?

Сейчас у меня есть код, который читает до 10000 * 32 000 строк , но я также хотел бы, чтобы код читал как можно больше строк, пока я не использовал 32 МБ памяти. Может быть, это другой вопрос, но я все еще хотел бы знать.

Ответы [ 24 ]

0 голосов
/ 16 декабря 2017

Для JSONObject вам может помочь приведенный ниже код.

`JSONObject.toString().getBytes("UTF-8").length`

возвращает размер в байтах

Я проверил это с моим объектом JSONArray, записав его в файл Это дает размер объекта.

0 голосов
/ 07 мая 2014
long heapSizeBefore = Runtime.getRuntime().totalMemory();

// Code for object construction
...
long heapSizeAfter = Runtime.getRuntime().totalMemory();
long size = heapSizeAfter - heapSizeBefore;

размер дает вам увеличение использования памяти jvm из-за создания объекта, и обычно это размер объекта.

0 голосов
/ 28 марта 2019

Предположим, я объявил класс с именем Complex, например:

public class Complex {

    private final long real;
    private final long imaginary;

    // omitted
}

Чтобы увидеть, сколько памяти выделено для живых экземпляров этого класса:

$ jmap -histo:live <pid> | grep Complex

 num     #instances         #bytes  class name (module)
-------------------------------------------------------
 327:             1             32  Complex
0 голосов
/ 09 сентября 2008

Я сомневаюсь, что вы хотите сделать это программно, если только вы не хотите сделать это один раз и сохранить его для будущего использования. Это дорогая вещь. В Java нет оператора sizeof (), и даже если бы он существовал, он бы считал только стоимость ссылок на другие объекты и размер примитивов.

Один из способов сделать это - сериализовать объект в файл и посмотреть на размер файла, например:

Serializable myObject;
ObjectOutputStream oos = new ObjectOutputStream (new FileOutputStream ("obj.ser"));
oos.write (myObject);
oos.close ();

Конечно, это предполагает, что каждый объект отличается от других и не содержит непереходных ссылок на что-либо еще.

Другая стратегия состояла бы в том, чтобы взять каждый объект и изучить его элементы путем отражения и сложить размеры (логическое значение & byte = 1 байт, короткий & char = 2 байта и т. Д.), Прокладывая путь вниз по иерархии членства. Но это утомительно и дорого и в итоге делает то же самое, что и стратегия сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...