15

Для распределений как на куче, так и вне кучи. On-heap - в контексте трех основных сборщиков мусора: CMS, Parallel Old и G1.Понимание внутренних свойств фрагментации процесса JVM Hotspot

То, что я знаю (или думаю, что я знаю) на данный момент:

  • все объект распределения (по-куче) округлены до 8 байт границы (или большей мощности 2, сконфигурированной -XX:ObjectAlignmentInBytes.
  • G1
    • Для на-кучи распределений меньше размера области (от 1 до 32 МБ, вероятно, около размеров кучи/2048) нет внутренней фрагментации, потому что нет никакой необходимости, потому что распределитель никогда «Заполняет дыры».
    • Для распределений большего размера региона он округляет выделение до размера региона. I. e. распределение размер области + 1 байт очень неудачный, он тратит почти 50% памяти.
  • Для CMS, единственная соответствующая информация, которую я нашел,

    Естественно старой космической PLABs имитировать структуру индексированного списка свободного пространства. В каждом потоке выделяется определенное количество блоков каждого размера ниже 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

+2

Почему вы хотите заняться? Помните, что этот материал изменяется от реализации к реализации и от обновления до обновления. Если вы пытаетесь оптимизировать, я думаю, что самая лучшая статья может быть самой современной. 2011 год был давным-давно. – markspace

+0

Google - ваш друг (используйте инструменты поиска -> в течение одного года): [Март 2015 JVM GC Tunning Guide] (https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/) – markspace

+0

@markspace Я прочитал это перед публикацией. В этом руководстве ничего не говорится о внутренней фрагментации. – leventov

ответ

4
  • Насколько я понимаю, вышеуказанные утверждения являются правильными, хотя бит на CMS отсутствует много контексте интерпретировать его.
  • CMS подвержен фрагментации (в своем старом пространстве, где работает CMS), что является одним из его основных недостатков. Если он фрагментирует слишком много, иногда может потребоваться остановить мир и выполнить полную метку, развертку и сжатие, чтобы удалить фрагментацию, что приводит к большой паузе в приложении. Именно этот недостаток часто упоминается как причина G1. Некоторые системы (например, HBase) целенаправленно выполняют большую часть своих распределений с блоками фиксированного размера, чтобы предотвратить или значительно уменьшить фрагментацию CMS, чтобы избежать длительных пауз.
  • ParallelOldGC (или «Старый GC» вообще) не фрагментирует. Объекты переносятся на старую кучу, и когда она заканчивается из космоса, запускается полный метка, развертка, компактный цикл.Он может выполнять эту полную GC быстрее, чем любой другой распределитель, но с типичным временем работы 1 секунду на 2 ГБ кучи, это может быть слишком большим для больших куч или чувствительных к задержкам приложений.
  • Точка доступа использовала различные стратегии для распределения вне кучи в зависимости от цели. Выделение собственных байт-буферов отличается от собственного распределения для скомпилированного кода или профилирующих данных. Я не могу отвечать с полномочиями здесь ни на какие подробности, но могу только предположить, что большая часть этого не использует системный распределитель, иначе Hotspot не будет работать так же хорошо, как и он. Кроме того, есть параметры, которые можно настроить таким образом, чтобы управлять некоторым из этого пространства, например. -XX:ReservedCodeCacheSize, который предполагает, что такая область памяти управляется посредством косвенной передачи, а не напрямую через системный распределитель. Короче говоря, я был бы весьма удивлен, если бы системный распределитель был напрямую использован для любого мелкозернистого распределения вообще в точке доступа.
+0

В основном вы обращаетесь к внешней фрагментации. Мой вопрос о внутренней фрагментации – leventov

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