Сколько памяти Хеш-таблица использует?

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

у Вас также есть четвертая альтернатива, что я думаю, было бы лучше, чем альтернативные 3:

haystack.find(needle, searcher)

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

9
задан Vinicius Pinto 15 September 2009 в 05:11
поделиться

2 ответа

Редактировать; Ой, я идиот, я дал информацию для HashMap, а не для HashTable. Однако после проверки реализации идентичны для целей памяти.

Это зависит от настроек внутренней памяти вашей виртуальной машины (упаковка элементов, 32-битные или 64-битные указатели и выравнивание / размер слов) и не определяется java.

Базовую информацию об оценке использования памяти можно найти здесь .

Вы можете оценить это так:

  • На 32-битных виртуальных машинах указатель составляет 4 байта, на 64-битных виртуальных машинах , это 8 байт.
  • Накладные расходы на объект составляют 8 байтов памяти (для пустого объекта, ничего не содержащего)
  • Объекты дополняются до размера, кратного 8 байтам (тьфу).
  • Есть небольшие постоянные накладные расходы для каждой хэш-карты: одно число с плавающей запятой, 3 целых числа, плюс накладные расходы на объект.
  • Существует массив слотов, некоторые из которых будут иметь записи, некоторые из них будут зарезервированы для новых. Отношение заполненных слотов к общему количеству слотов НЕ БОЛЬШЕ, ЧЕМ указанный в конструкторе коэффициент загрузки.
  • Для массива слотов требуется один служебный объект, плюс один int для размера, плюс один указатель для каждого слота, чтобы указать сохраненный объект.
  • Количество слотов обычно в 1,3–2 раза больше, чем количество сохраненных сопоставлений , при коэффициенте загрузки по умолчанию 0,75, но может быть меньше этого, в зависимости от хеш-коллизий.
  • Каждое сохраненное отображение требует объекта записи. Для этого требуются один служебный объект, 3 указателя, а также сохраненные объекты ключей и значений, а также целое число.

Итак, сложим все вместе (для 32/64 бит Sun HotSpot JVM):

  • Для массива слотов требуется один служебный объект, плюс один int для размера, плюс один указатель для каждого слота, чтобы указать сохраненный объект.
  • Количество слотов обычно в 1,3–2 раза больше, чем количество сохраненных сопоставлений , при коэффициенте загрузки по умолчанию 0,75, но может быть меньше этого, в зависимости от хеш-коллизий.
  • Каждое сохраненное отображение требует объекта записи. Для этого требуется один служебный объект, 3 указателя, а также сохраненные объекты ключей и значений, а также целое число.
  • Итак, собираем все вместе (для 32/64 битной JVM Sun HotSpot):

  • Для массива слотов требуется один служебный объект, плюс один int для размера, плюс один указатель для каждого слота, чтобы указать сохраненный объект.
  • Количество слотов обычно в 1,3–2 раза больше, чем количество сохраненных отображений , при коэффициенте загрузки по умолчанию 0,75, но может быть меньше этого, в зависимости от хеш-коллизий.
  • Каждое сохраненное отображение требует объекта записи. Для этого требуется один служебный объект, 3 указателя, а также сохраненные объекты ключей и значений, а также целое число.
  • Итак, собираем все вместе (для 32/64 битной JVM Sun HotSpot):

  • Каждое сохраненное отображение требует объекта записи. Для этого требуется один служебный объект, 3 указателя, а также сохраненные объекты ключей и значений, а также целое число.
  • Итак, собираем все вместе (для 32/64 битной JVM Sun HotSpot):

  • Каждое сохраненное отображение требует объекта записи. Для этого требуются один служебный объект, 3 указателя, а также сохраненные объекты ключей и значений, а также целое число.
  • Итак, сложим все вместе (для 32/64 бит Sun HotSpot JVM): HashMap требуется 24 байта (сам, основные поля) + 12 байтов (константа массива слотов) + 4 или 8 байтов на слот + 24/40 байтов на запись + размер ключевого объекта + размер объекта значения + дополнение каждого объекта до кратного 8 байтам

    ИЛИ примерно (в большинстве настроек по умолчанию, точность не гарантируется):

    • В 32-битной JVM: 36 байтов + 32 байта / отображение + ключи и значения
    • В 64-битной JVM: 36 байтов + 56 байт / сопоставление + ключи и значения

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

    14
    ответ дан 4 December 2019 в 11:42
    поделиться

    Трудно оценить. Я бы сначала прочитал это: http://www.codeinstructions.com/2008/12/java-objects-memory-structure.html

    Just use the sunjdk tools to figure out the size of K, V and

    jmap -histo [pid]

    num #instances #bytes class name

    1: 126170 19671768 MyKClass

    2: 126170 14392544 MyVClass

    3: 1 200000 MyHashtable

    Also you may want to use HashMap instead of Hashtable if you do not need synchronization.

    4
    ответ дан 4 December 2019 в 11:42
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: