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

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

 BacMan13 янв. 2011 г., 16:48
Не могли бы вы сохранить дату как длинный примитив и преобразовать ее в дату, когда это необходимо?

Ответы на вопрос(7)

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

 Peter Lawrey13 янв. 2011 г., 17:15
Убедитесь, что вы используете «long», а не «Long», иначе вы не получите нужную вам выгоду. Длинна примерно в 4 раза меньше даты.
 Michael McGowan13 янв. 2011 г., 16:57
Использование примитивного long было альтернативой, которую я имел в виду. Однако я планировал написать несколько пользовательских методов для выполнения того, что уже делает Date, вместо создания объектов Date по мере необходимости, как вы предлагаете.

timestamp, вы можете даже использовать int:

20110113

Вот слишком:

Самый простой способ ответить на этот вопрос - взглянуть на исходный код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в конце конструктора, поэтому конечный результат также12 байт.

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

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

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

Решение Вопроса

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

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

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

 Edwin Buck13 янв. 2011 г., 17:18
Раздувание это относительный термин. Java поддерживает сборку мусора объектов, что, как минимум, означает, что объект должен хранить свой идентификатор и текущее пространство этого идентификатора в памяти. Объект также нуждается в ссылке на его тип. В данный момент, возможно, есть нечто большее, чем я рассматриваю, но такое хранилище будет раздутым, если вы не хотите, чтобы объект предоставлял функции. Если вам не нужны эти функции, выделите массив long и покончите с этим.
 Dunes13 янв. 2011 г., 17:08
Это потому, что Date - это просто объект-оболочка на долгое время. Я быстро взглянул на API, и все, что делало бы объект Date полезным, устарело и было заменено на Calendar.
 Peter Lawrey13 янв. 2011 г., 17:13
@ Дюны, обратная сторона Календаря гораздо дороже. Я предлагаю вам использовать календарь только так, как вам нужно.
 Michael McGowan13 янв. 2011 г., 17:06
Спасибо! Я знаю, что объекты более раздуты, чем примитивы, но я не ожидал 4-кратной разницы.
 Michael McGowan13 янв. 2011 г., 18:07
@Peter Это правда, что это действительно имеет значение, если у вас есть много этих объектов, но я был совершенно уверен, что яделать есть много этих объектов. В моем приложении мы уже сталкивались с многочисленными случаями, когда разработчик использовал философию «память дешевая», которую вы описали, только чтобы она вернулась, чтобы укусить нас. Кроме того, клиент может захотеть использовать наше программное обеспечение без необходимости покупать новый компьютер (и у него может быть 32-разрядная ОС, ограничивающая его потенциальный размер кучи).

измерительные приборы фреймворк,GetObjectSize говорит, что это 24B.

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, включали ссылки на сами даты в расчете?

и длинное значение составляет 8 байтов -2 ^ 63 до (2 ^ 63) -1

 Michael McGowan13 янв. 2011 г., 16:58
Я знаю, что длина составляет 8 байтов иМожно использоваться для представления даты, но я не знаю, делает ли это java.util.Date. Также тот факт, что объект не является примитивным, может означать, что он больше, даже если поддерживается длинным.
 fmucar13 янв. 2011 г., 17:05
@Micheal, Вы правы, объект даты, вероятно, больше 8 байт, но это не потому, что он использует другой способ представления даты внутри, а потому, что у него есть несколько других объектов, определенных внутри. Смотрите реализацию класса Date. long достаточно велик, чтобы обеспечить точное время, а не JSUT в мс, это даже большая задержка в наносекундах.

Ваш ответ на вопрос