5

Я прочитал what-is-the-memory-consumption-of-an-object-in-java и what-is-the-memory-overhead-of-an-object-in-java.Что на самом деле издержки памяти в java?

Но все же я в замешательстве.

  • Что такое память наверху? это padding?
  • Что такое JVM со сжатыми указателями? это reference ??
  • Если используется 32-bit JVM, тогда накладных расходов будет меньше? Конечно, да. Но это из-за заполнения?
  • Как лучше использовать всегда 32-bit JVM для эффективности памяти или для производительности?

Ниже изображения от this link (страницы No.26)

В этом изображении при запуске себя они показаны как 16 байт JVM накладных, почему это так ??

enter image description here

+1

Что касается 32 против 64 битных виртуальных машинах: см http://stackoverflow.com/questions/17285928/jre-32bit-vs-64bit – GhostCat

+0

@GhostCat но если 32 бит лучше consumption..what памяти является причиной для 64-битного jvm ?? это потому, что 32-битный ограничивается кучей в 4 ГБ или сжатыми oops ?? –

+0

http://openjdk.java.net/projects/code-tools/jol/ – the8472

ответ

7

Что такое накладные расходы памяти ??

Когда используется больше памяти, чем созданные вами поля.

Это прокладка?

Некоторые из них являются дополнением, которое может появляться в любом месте объекта, за исключением заголовка, который всегда находится в начале. Заголовок обычно имеет длину 8-12 байтов.

Что такое JVM со сжатыми указателями?

Способ использования 32-разрядных указателей в 64-разрядной JVM для сохранения памяти.

Это ссылка?

Ссылки могут использовать эту технику, но поэтому могут указывать на информацию о классе для объекта.

Если используется 32-разрядная JVM, накладные расходы будут меньше?

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

Но это из-за обивки?

Это потому, что 64-разрядные указатели используют больше места, чем 32-разрядный указатель.

. Так лучше использовать всегда 32-разрядную JVM для эффективности памяти или для производительности?

Нет, 32-битный процессор модель имеет 32-битовые регистры, где, как 64-битная модель имеет в два раза больше регистров, которые в два раз размера (64 бит) означают гораздо больше, может быть проведена в самом быстром памяти, регистров. 64-битные вычисления также бывают более быстрыми, а также с 64-битной моделью обработки.

В общем, я бы порекомендовал вам всегда использовать 64-битную JVM, если вы a) не можете или b) иметь очень небольшой объем памяти.

На этом изображении при старте они показаны как 16 байтов накладных расходов JVM, почему это так?

Это не совсем правильно. Предполагается, что у вас есть ссылка на не сжатый класс, поэтому заголовок имеет 12 байтов, однако по умолчанию 8 байтов выровнены по умолчанию, что означает, что на конце будет 0 байтов от (что составляет 16 байт, но это еще не все начало)

Справка: Почему 32-битный адрес Сжатой ООП более 4 ГБ

объекта может иметь, чтобы быть 8-байтовой выровнен по умолчанию. Это облегчает управление памятью, но иногда откладывает отладку. Побочным эффектом является то, что адрес каждого объекта будет иметь 000 для младших трех бит (он должен быть кратным 8). Эти биты не нужно хранить. Это позволяет сжатым oops адресовать 8 * 4 ГБ или 32 ГБ.

С выравниванием объекта 16 байт виртуальная машина может адресовать 64 ГБ с 32-битной ссылки (однако, накладные расходы обивка выше, и может быть не стоит)

IFAQ: Почему это медленнее, около 28 - 32 ГБ

В то время как ссылку можно умножить на 8, куча не начинается с начала памяти. Обычно он начинается примерно на 4 ГБ. Это означает, что если вы хотите полностью 32 ГБ, вам нужно добавить это смещение, которое имеет небольшие накладные расходы.

вороха размеры:

  • < 4 ГБ - ноль расширения адреса с
  • 4 - 28 ГБ - умножить на 8 или << 3 примечание: x64 имеет инструкции для этого, чтобы поддержать double[] и long[]
  • 28 - 32 ГБ - умножить на 8 и добавить регистр, удерживающий смещение. Чуть медленнее, но обычно это не проблема.
+0

..thanks..but все еще 1 сомнение, что заголовок ?? что потреблять 8-12 байтов? –

+0

И это *, потому что 64-разрядные указатели используют больше места, чем 32-разрядный указатель. * ... то как насчет сжатых oops ?? –

+1

@Sam заголовок - это информация, которая находится в начале объекта. Он включает в себя системный хэш-код объекта и указатель класса, чтобы сказать, какой тип объекта у вас есть. Вот несколько примеров взаимодействия с заголовком https://github.com/peter-lawrey/Performance-Examples/blob/master/src/main/java/vanilla/java/unsafe/UnsafeIdentityDemo.java –

Смежные вопросы