Способен ли JIT оптимизировать распределение памяти?

Это диаграмма GC от visualvm для простого приложения, которое прослушивает некоторый входящий поток данных через веб-сокет... При запуске он создает много мусора, но, как вы можете видеть, со временем он становится лучше... Это JIT вычисляет как-то как избежать создания объектов?

введите описание изображения здесь

1 ответ

Решение

Есть несколько очень специфических случаев, когда JIT может удалить выделения и, следовательно, снизить нагрузку на GC. Главным образом с анализом побега. В принципе, если объект живет только в рамках одного метода и никогда не покидает его, он может быть размещен в стеке, а не в куче, что уменьшает работу сборщика мусора. Если вы хотите знать наверняка: вы можете отключить Escape-анализ: используйте аргумент командной строки -XX:-DoEscapeAnalysis и посмотрите, изменится ли график.

Однако есть много других самонастраивающихся механизмов. Как система во время выполнения замечает, что вам не нужно так много памяти, и, следовательно, начинает уменьшать размер кучи. Ваш график будет соответствовать этому. Поскольку большая часть памяти всегда может быть освобождена, система памяти уменьшает размер кучи: с более частыми, но меньшими GC.

Другие вопросы по тегам