Насколько точно массивы Java используют память в HotSpot (т. Е. Сколько памяти)?

Реализации

C malloc обычно не выделяют точный объем запрошенной памяти, а вместо этого потребляют запуски памяти фиксированного размера, например, с размерами степени двойки, так что выделение 1025 байтов фактически занимает 2048-байтовый сегмент с 1023 байтами, потерянными как отставание.

Использует ли HotSpot аналогичный механизм выделения для массивов Java? Если да, то как правильно распределить массив Java таким образом, чтобы не было спада? (Например, должна ли длина массива быть степенью двойки или, может быть, степенью двойки минус некоторое фиксированное количество служебных данных?)

7 голосов | спросил hsivonen 11 J0000006Europe/Moscow 2015, 19:29:13

1 ответ


0

Если вы спрашиваете о языке, ответ таков: он не указан (так же, как и для языка C)

Если вы спрашиваете о конкретной реализации, проверьте эту реализацию. Я считаю, что для Hotspot его гранулярность составляет 8 байт; то есть размеры объекта округляются до следующей границы гранулярности. Если речь идет об увеличении размера кучи, когда не хватает свободной кучи, то это зависит от реализации, настроек GC, параметров размера кучи и т. Д .; затрудняет точный ответ.

РЕДАКТИРОВАТЬ: используя небольшой взлом отражения, получая доступ к классу sun.misc.Unsafe (только Oracle JRE), ссылки на объекты могут быть преобразованы в адреса памяти; Выведите адреса двух последовательно расположенных массивов, чтобы проверить себя.

И я в основном задал тот же вопрос здесь: Определить оптимальный размер массива с учетом степени детализации памяти JVM включите пример использования класса Unsafe для проверки размера объекта)

ответил Durandal 11 J0000006Europe/Moscow 2015, 20:34:01

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132