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

Сколько байтов памяти использует объект java.util.Date?

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

4b9b3361

Ответ 1

Моя реакция кишки заключалась в том, что накладные расходы памяти для Date были бы очень маленькими. Изучая исходный код, кажется, что класс содержит только одно поле экземпляра (длинные миллисекунды). Это означает, что размер объекта даты - это размер длинного плюс размер экземпляра объекта, то есть очень маленький.

Затем я нашел этот код, который создает тысячи объектов для определения размера объекта. Он говорит, что размер java.util.Date равен 32 байтам. Сравните это, просто сохраняя дату как длинную (что то, что она делает внутри) - длинный 8 байтов, поэтому вам нужно заплатить четыре раза за удобство наличия объекта даты.

Однако накладные расходы на создание объектов не очень высоки. Поэтому, если вы действительно беспокоитесь о пространстве, сохраните даты как долготы и создайте объект Date по мере необходимости.

Ответ 2

Использовать примитив долго?

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

Ответ 4

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

20110113

Ответ 5

Как ответил здесь:

Самый простой способ ответить на этот вопрос - посмотреть исходный код java.util.Date.

Он имеет только 2 нестатических поля (Java 1.7.0_55):

private transient long fastTime;
private transient BaseCalendar.Date cdate;

long имеет размер памяти 8 байтов, а cdate - это ссылка на объект, размер которой равен 4 байтам. Итак, в общей сложности 12 байт.

Если бы cdate был создан, он мог бы потребовать дополнительные байты в памяти, но если вы посмотрите на конструкторы тоже, иногда это даже не будет затронуто, а в других будет null -ed на конец конструктора, поэтому конечный результат также 12 байтов.

Это просто для создания Date. Если вы вызываете методы на Date (например, Date.toString()), будет создавать и хранить объект в поле cdate, которое не будет очищено. Поэтому, если вы вызываете определенные методы на Date, его использование памяти будет увеличиваться.

Примечание. Ссылки на объекты могут быть 64-битными в длину на 64-битных JVM, в этом случае использование памяти будет 16 байт.

Примечание # 2: Также обратите внимание, что это просто использование памяти самого объекта Date. Скорее всего, вы сохраните его ссылку где-нибудь, например. в массиве или списке или в поле другого класса, для которого потребуются дополнительные 4 байта (или, может быть, 8 байтов на 64-битных JVM).

Ответ 6

Объект

java.util.Date может быть представлен длинным значением, а длинное значение - 8 байт -2 ^ 63 до (2 ^ 63) -1

Ответ 7

Я попробовал ручной расчет на основе правил здесь: http://www.javamex.com/tutorials/memory/object_memory_usage.shtml и проверки исходного кода объекта Date в Java 7 на память использование.

Object overhead: 8 bytes => 8 bytes
+ 1 long fastTime: 8 bytes => 16 bytes
+ 1 reference cdate: 4 bytes => 20 bytes
Rounded up to nearest multiple of 8 => 24 bytes

Может быть, мне не хватает чего-то в калькуляции или инструменты, которые использовались в других ответах, которые дали результат 32, включали ссылки на сами даты в расчете?