Я поддерживаю приложение обмена сообщениями Java, которое требует низкой задержки (< 300 микросекунд, обрабатывающих каждое сообщение). Тем не менее, наше профилирование показывает, что виртуальная машина Sun Java сначала запускается медленно и ускоряется после первых 5000 сообщений или около того. Первые 5000 сообщений имеют латентность 1-4 миллисекунды. После того, как первые 5000, последующие сообщения имеют задержку ~ 250 микросекунд, со случайными выбросами.
В целом понятно, что это типичное поведение для Java-приложения. Однако, с точки зрения бизнеса, неприемлемо сообщать клиенту, что им приходится ждать, пока JVM "разогревается", прежде чем увидит, какую производительность они требуют. Приложение должно быть "разогрето" перед обработкой первого сообщения клиента.
JVM - обновление Sun 1.6.0 4.
Идеи для преодоления этой проблемы:
- Настройки JVM, такие как -XX: CompileThreshold =
- Добавить компонент для "разминки" приложения при запуске, например, путем отправки "поддельных сообщений" через приложение.
- Статически загружать приложение и классы JDK при запуске приложения, чтобы классы не загружались из JAR при обработке клиентских сообщений.
- Некоторая утилита или агент Java, который выполняет одну или обе из этих двух идей, так что мне не нужно повторно изобретать колесо.
ПРИМЕЧАНИЕ. Очевидно, что для этого решения я рассматриваю все факторы, включая микросхему, тип диска и конфигурацию и настройки ОС. Однако для этого вопроса я хочу сосредоточиться на том, что можно сделать для оптимизации приложения Java и свести к минимуму "разогрев" времени.