Что на самом деле накладные расходы памяти в Java?
Я прочитал, что является "потреблением памяти объекта в java" и " что является объемом памяти" объекта в java.
Но я все еще в замешательстве.
- Что такое накладные расходы памяти? это
padding
? - Что такое
JVM
со сжатыми указателями? этоreference
?? - Если
32-bit JVM
используется тогда накладные расходы будут меньше? Конечно, да. Но это из-за прокладки? - Так что лучше всегда использовать
32-bit JVM
для эффективности памяти или для производительности?
Ниже изображение из этой ссылки (страница № 26)
На этом изображении при запуске они показаны как 16-байтовые издержки JVM, почему это так??
1 ответ
Что такое накладные расходы памяти?
Когда используется больше памяти, чем полей, которые вы создали.
это прокладка?
Некоторым является отступ, который может появляться в любом месте объекта, кроме заголовка, который всегда находится в начале. Длина заголовка обычно составляет 8-12 байт.
Что такое JVM со сжатыми указателями?
Методика использования 32-битных указателей в 64-битной JVM для экономии памяти.
это ссылка?
Ссылки могут использовать эту технику, но также могут указатели на информацию о классе для объекта.
Если используется 32-битная JVM, тогда издержки будут меньше?
Возможно, хотя это то же самое, что использование сжатых указателей для ссылок и классов.
Но это из-за набивки?
Это потому, что 64-разрядные указатели используют больше места, чем 32-разрядные указатели.
Так что лучше использовать всегда 32-битную JVM для эффективности памяти или для производительности?
Нет, 32-разрядная модель процессора имеет 32-разрядные регистры, где, поскольку 64-разрядная модель имеет вдвое больше регистров, что в два раза больше (64-разрядного), это означает, что в самой быстрой памяти может храниться гораздо больше регистров. 64-битные вычисления, как правило, быстрее с 64-битной моделью обработки.
В общем, я бы порекомендовал вам всегда использовать 64-битную JVM, если вы а) не можете или б) не располагаете очень небольшим объемом памяти.
На этом изображении при запуске они показаны как 16-байтовые издержки JVM, почему это так??
Это не совсем правильно. Это предполагает, что у вас есть несжатая ссылка на класс, поэтому заголовок имеет 12 байтов, однако объекты по умолчанию выровнены на 8 байтов, что означает, что в конце будет 4 байта заполнения (что составляет 16 байтов, но не все в начале)
Часто задаваемые вопросы: почему 32-разрядный сжатый ООП может адресовать более 4 ГБ
Объект должен быть выровнен по 8 байт по умолчанию. Это облегчает управление памятью, но иногда тратит впустую некоторое заполнение. Побочным эффектом является то, что адрес каждого объекта будет иметь 000 для самых младших трех битов (он должен быть кратен 8). Эти биты не нужно хранить. Это позволяет сжатым упам обращаться к 8 * 4 ГБ или 32 ГБ.
С 16-байтовым выравниванием объекта JVM может адресовать 64 ГБ с 32-битной ссылкой (однако накладные расходы выше и могут не стоить того)
IFAQ: Почему он медленнее, около 28 - 32 ГБ
Хотя ссылка может быть умножена на 8, куча не начинается с начала памяти. Обычно начинается примерно через 4 ГБ. Это означает, что если вы хотите использовать все 32 ГБ, вы должны добавить это смещение, которое имеет небольшие накладные расходы.
Размеры кучи:
- <4 ГБ - нулевой адрес расширения
- 4 - 28 ГБ - умножьте на 8 или
<< 3
примечание: в x64 есть инструкция для поддержкиdouble[]
а такжеlong[]
- 28 - 32 ГБ - умножить на 8 и добавить регистр, содержащий смещение. Немного медленнее, но обычно это не проблема.