Техника или утилита для уменьшения времени “прогрева” Java?

Лучшая реализация набора, которую я видел, является частью Наборов Питания замечательного Wintellect: http://www.codeplex.com/PowerCollections .

реализация набора может быть найдена здесь:
http://www.codeplex.com/PowerCollections/SourceControl/FileView.aspx?itemId=101886&changeSetId=6259
Это имеет все ожидаемые операции присвоения (объединение, пересекитесь, и т.д.).

Hope это помогает!

40
задан noahlz 26 September 2009 в 18:49
поделиться

4 ответа

«Разминка» в Java обычно связана с двумя вещами:

(1): Ленивая загрузка класса: это можно обойти, принудительно загрузив его.

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

Другой способ сделать это - принудительно инициализировать класс путем доступа к этому классу, когда вы программа запускается.

(2): Оптимизация в реальном времени: Во время выполнения Java VM оптимизирует некоторую часть кода. Это основная причина, по которой вообще есть время прогрева.

Чтобы облегчить это, вы можете отправить кучу фальшивых (но выглядящих реальными) сообщений, чтобы оптимизация могла завершиться до того, как ваш пользователь ее использует.

Еще одно, что вы можете облегчить, это поддержка встроенных функций, таких как использование private и final, насколько это возможно. причина в том, что виртуальной машине не нужно искать в таблице наследования, чтобы увидеть, какой метод на самом деле должен быть вызван.

Надеюсь, это поможет.

31
ответ дан 27 November 2019 в 01:47
поделиться

Ваша проблема заключается не в загрузке класса, а в компиляции "точно в срок".

Попробуйте -XX: CompileThreshold = 1

Это заставит Java скомпилировать все в первый раз он управляет им. Это несколько замедлит запуск вашего кода, но не кода виртуальной машины (поскольку он компилируется при установке Java). Открыта ошибка, позволяющая Java компилировать пользовательские JAR-файлы аналогичным образом и сохранять результат для последующего выполнения, что значительно снизило бы эти накладные расходы, но нет необходимости исправлять эту ошибку в ближайшее время.

Второй вариант - это отправить 5'000 фейковых сообщений в приложение, чтобы «разогреть». Продайте это как «убедиться, что все настроено правильно».

[EDIT] Некоторая справочная информация по прекомпиляционным классам: Совместное использование данных классов

Вы можете попробовать версию Java от IBM, поскольку здесь вы можете добавить больше классов в общий пул: Обзор класса обмен данными

[EDIT2] Чтобы ответить на вопросы, поднятые kittylyst : Это правда, что это быстро заполнит ваш кеш кода методами, которые используются только один раз. И это может даже сделать ваше приложение медленнее.

Если вы установите низкое значение, время запуска вашего приложения может стать ужасно медленным. Это связано с тем, что JIT-оптимизация + запуск скомпилированного кода дороже, чем однократный запуск кода в интерпретируемом режиме.

Основная проблема здесь в том, что код по-прежнему компилируется «точно в срок». Пока вы не можете запускать каждый метод, который вам нужен хотя бы один раз, приложение будет «зависать» на несколько миллисекунд каждый раз, когда обнаруживает что-то, что не было скомпилировано ранее.

Но если у вас есть ОЗУ, ваше приложение маленькое, или вы можете увеличить размер кеша кода, и вы не возражаете против медленного запуска, вы можете попробовать. Как правило, настройки по умолчанию довольно хороши.

15
ответ дан 27 November 2019 в 01:47
поделиться

Используете ли вы JVM клиента или сервера? Попробуйте запустить вашу программу с:

java -server com.mycompany.MyProgram

При запуске Sun JVM в этом режиме JIT скомпилирует байт-код в собственный код раньше; из-за этого программе потребуется больше времени для запуска, но после этого она будет работать быстрее.

Ссылка: Часто задаваемые вопросы о виртуальной машине Java HotSpot

Цитата:

В чем разница между - системы клиента и сервера?

Эти две системы представляют собой разные двоичные файлы. По сути, это два разных компилятора (JIT), взаимодействующих с одной и той же системой времени выполнения. Клиентская система оптимальна для приложений, которым требуется быстрое время запуска или небольшая занимаемая площадь, серверная система оптимальна для приложений, где общая производительность является наиболее важной. В целом клиентская система лучше подходит для интерактивных приложений, таких как GUI. Некоторые из других отличий включают политику компиляции, значения по умолчанию для кучи и политику встраивания.

3
ответ дан 27 November 2019 в 01:47
поделиться

Seems like your project would benefit from real time guarantees:

See: Real Time Java

-4
ответ дан 27 November 2019 в 01:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: