Для распределений на кучу и вне кучи. On-heap - в контексте трех основных сборщиков мусора: CMS, Parallel Old и и G1.
То, что я знаю (или думаю, что знаю) на данный момент:
- распределения всех объектов (по-куче) округляются до 8-байтовой границы (или большей мощности 2, с настройкой
-XX:ObjectAlignmentInBytes
. - G1
- Для распределений на куче, меньших размера региона (от 1 до 32 МБ, вероятно, вокруг размера кучи /2048), нет внутренней фрагментации, потому что нет необходимости, потому что распределитель никогда не "заполняет отверстия".
- Для распределений большего размера региона он округляет распределение до размера региона. I. e. выделение области размером + 1 байт очень неудачно, оно отнимает почти 50% памяти.
-
Для CMS единственная релевантная информация, которую я нашел, -
Естественно старые PLAB-схемы пространства имитируют структуру индексированного свободного списка. В каждом потоке выделяется определенное количество блоков каждого размера ниже 257 слов кучи (большой фрагмент, выделенный из глобального пространства).
От http://blog.ragozin.info/2011/11/java-gc-hotspots-cms-promotion-buffers.html. Насколько я понимаю, "глобальное пространство" - это основное старое пространство.
Вопросы:
- Правильны ли приведенные выше утверждения?
- Каковы свойства фрагментации основного старого пространства в CMS? Что относительно распределений более чем "257 слов кучи"?
- Как управлять старым пространством с помощью Parallel Old GC?
- Использует ли Hotspot JVM распределитель системной памяти для распределений вне кучи или перенаправляет его с помощью специального распределителя?
UPD. Тема обсуждения: https://groups.google.com/forum/#!topic/mechanical-sympathy/A-RImwuiFZE