Pull to refresh

Comments 18

Появляются доп. расходы на преобразование JVM ссылок в нативные и обратно.

Есть информация, что потери на преобразование ссылок, компенсируются тем, что за счёт уменьшения размеров объектов, больше данных помещается в кешах процессора, т.е. в некоторых случаях получаем не потерю, а прирост производительности.
Заодно выравнивание получается немного по-лучше. 64-битная JVM отвратительно работает с выравниванием (не экономно и многие стандартные библиотеки написаны с учётом выравнивания 32-бита)/
На Хабре были статьи про выравнивание в Java. Там очень показательно было, что на x64 стандартные объекты реpко растут в размере из-за изменения выравнивания указателей.
Да, все верно. На разного рода тестах при переходе на сжатые указатели прирост работы JVM составляет 2-10%.
-XX:+UseStringCache
Все константные строки JVM сначала будет пытаться найти в динамическом кэше. В результате одинаковые по содержимому строки из разных классов (модулей) будут указывать на один и тот же объект String. Экономит время на выделении памяти под объект и его инициализации, за счёт времени поиска при инициализации строки. Было в одном бородатых Release Notes. В принципе имеет смысл.
Дык,. там именно это и делается — если включен StriingCache, то строка ищется в системном словаре. Если строка найдена, то используется она. Если строка не найдена или кэш отключен, то происходит обычное выделение памяти и инициализация.
Как все запущено. :(
Escape Analysis НЕ размещает объекты на «стеке вместо кучи». Escape Analysis — это анализ, а не оптимизация. Он вообще ничего оптимизирует, а только проводит анализ кода и предоставляет полученную информацию другим частям HotSpot'а которые и делают оптимизацию. Это первое.
Второе — размещения объектов на стеке нет. Вообще, такая оптимизация возможна и даже есть альтернативные JVM в которых это реализовано. Вместо этого HotSpot содержит другую оптимизацию, которая называется Scalar replacement. То есть если объект локален (не убегает), то его можно заменить на россыпь локалов (которые, при сотворении кода девелопером, были полями этого объекта). То есть вместо объекта (композитной сущности ) — получаем кучку скаляров. Это и есть Scalar Replacement.
Ключика включать Scalar Replacement нет. Он всегда включен, просто если выключить Escape анализ — то для него не будет информации и он ничего не сделает.
В конце-концов можно же считать, что эти локалы размещаются на стеке?
UFO just landed and posted this here
По первому пункту — абсолютно согласен, я и нигде не говорил, что оптимизацию делает EscapeAnalysis.

По второму — спасибо за замечание, подправил. Я не правильно понял термин Scalar replacement.
Интересная статься. Некоторые опции достаточно экзотичны, не слышал о них, с трудом представляю зачем может, например, понадобится сжатие строк. По производительности в Jave, есть хорошая книга, дает представление со всех сторон:
www.amazon.com/Java-Performance-Charlie-Hunt/dp/0137142528
Оставлю на всякий случай список опций, который часто может поднять производительность в разы:

Xmx2048M -Xms2048M -XX:ParallelGCThreads=8 -Xincgc -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:+AggressiveOpts -XX:+CMSParallelRemarkEnabled -XX:+DisableExplicitGC -XX:MaxGCPauseMillis=500 -XX:SurvivorRatio=16 -XX:TargetSurvivorRatio=90 -XX:+UseAdaptiveGCBoundary -XX:-UseGCOverheadLimit -Xnoclassgc -XX:UseSSE=3 -XX:PermSize=128m -XX:LargePageSizeInBytes=4m

В своё время помогли поднять производительность сервера майнкрафт, а затем и самописной КИС в tomcat на 200-800% (в некоторых местах и больше). Само собой, xms/xmx/gcghreads надо тюнить, но там всё легко. А вот как работают некоторые остальные опции — для меня загадка :)
-XX:+UseConcMarkSweepGC и -XX:+UseAdaptiveGCBoundary вместе не работают. последний только в Parallel GC используется.
Список хорош для того, чтобы пойти гуглить опции. И выйти на статьи, описывающие регионы памяти hotspot, варианты и особенности сборки мусора, способы мониторинга.

А так похоже на теорию заговора: существуют секретные опции HotSpot, ускоряющие её в разы. Oracle скрывает.
А если я выставлю maxpermsize=121m у меня сильно упадет производительность?
А что за invokeDynamic? Первый раз слышу об этом. Объясните, пожалуйста, на пальцах, что это и зачем.
В статье есть ссылка. Самая первая. Я думаю лучше будет по ней прочитать, чем читать из 3-х рук.
Sign up to leave a comment.

Articles