Какие части кода нужно разогреть?
Обычно ничего делать не нужно. Однако для приложения с малой задержкой вам следует разогреть критический путь в вашей системе. У вас должны быть модульные тесты, поэтому я предлагаю вам запускать их при запуске, чтобы разогреть код.
Даже после того, как ваш код разогрет, вы также должны следить за тем, чтобы кеш-память вашего процессора оставалась теплой. Вы можете увидеть значительное снижение производительности после операции блокировки, например. сетевой ввод-вывод до 50 микросекунд. Обычно это не проблема, но если большую часть времени вы пытаетесь оставаться на уровне менее 50 микросекунд, то в большинстве случаев это будет проблемой.
Примечание. Разминка может позволить сработать анализу побега и поместить некоторые объекты в стек. Это означает, что такие объекты не нужно оптимизировать. Перед оптимизацией кода лучше сохранить профиль вашего приложения в памяти.
Даже если я разогреваю некоторые части кода, как долго он остается теплым (при условии, что этот термин означает только то, как долго объекты вашего класса остаются в памяти)?
Нет ограничений по времени. Это зависит от того, обнаружит ли JIt, что предположение, сделанное им при оптимизации кода, оказалось неверным.
Как это помогает, если у меня есть объекты, которые нужно создавать каждый раз, когда я получаю событие?
Если вам нужна низкая задержка или высокая производительность, вы должны создавать как можно меньше объектов. Я стремлюсь производить менее 300 КБ / сек. С такой скоростью распределения у вас может быть достаточно большое пространство Eden, чтобы собирать небольшие деньги один раз в день.
Рассмотрим для примера приложение, которое, как ожидается, будет получать сообщения через сокет, и транзакциями могут быть «Новый заказ», «Изменить заказ» и «Отменить заказ» или транзакция подтверждена.
Я предлагаю вам как можно чаще повторно использовать объекты, хотя, если это находится в рамках вашего бюджета распределения, возможно, об этом не стоит беспокоиться.
Обратите внимание, что приложение предназначено для высокочастотной торговли (HFT), поэтому производительность чрезвычайно важна.
Возможно, вас заинтересует наше программное обеспечение с открытым исходным кодом, которое используется для HFT-систем в различных инвестиционных банках и хедж-фондах.
http://chronicle.software/
Мое производственное приложение используется для высокочастотной торговли, и любая задержка может быть проблемой. Совершенно очевидно, что при запуске, если вы не прогреете свое приложение, это приведет к высокой задержке в несколько миллисекунд.
В частности, вас может заинтересовать https://github.com/OpenHFT/Java-Thread-Affinity, поскольку это Библиотека может помочь уменьшить джиттер планирования в ваших критических потоках.
Также сказано, что критические участки кода, требующие разогрева, должны запускаться (с фальшивыми сообщениями) не менее 12К раз, чтобы он работал оптимальным образом. Почему и как это работает?
Код компилируется с использованием фоновых потоков. Это означает, что даже если метод может быть пригоден для компиляции в собственный код, это не означает, что он сделал это, особенно при запуске, когда компилятор уже довольно занят. 12К вполне разумно, но могло быть и больше.
person
Peter Lawrey
schedule
24.03.2016
-XX:+PrintCompilation
полезным для отслеживания поведения компиляции. Вы также можете связаться с oracle, они работают над компилятором AOT, который в настоящее время предлагается только коммерческим клиентам AIUI. Я думаю, что некоторые другие поставщики JVM также предлагают AOT. - person the8472   schedule 24.03.2016