Как я могу предварительно загрузить классы веб-приложений в JVM при запуске? - PullRequest
4 голосов
/ 20 марта 2009

В наших веб-приложениях первая загрузка некоторых страниц занимает небольшое, но заметное дополнительное время из-за загрузки класса. У кого-нибудь есть какие-нибудь умные способы предварительной загрузки классов веб-приложений в JVM при запуске?


Обновление : то, что мы сейчас делаем, - это сохранение группы (700) полных имен классов в таблице базы данных. Мы читаем таблицу при запуске и делаем Class.forName (). Это прекрасно работает, но я подумал, что может быть более умный подход. Мы определили 700 классов, на которые ссылались при запуске, используя профилировщик.

Ответы [ 6 ]

2 голосов
/ 21 мая 2009

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

Возможно, лучшим подходом будет написать сервлет, который при запуске попадет на несколько ваших медленно загружаемых страниц и выбросит результаты. Это заставляет классовые нагрузки. Загрузка этих страниц много раз увеличит объем выполненной своевременной компиляции (как ускорение кода, так и сокращение затрат на компиляцию JIT). Есть и другие преимущества: это «самотестирование при включении», оно приводит к выполнению одноразовых задач запуска и может также до некоторой степени заполнять различные кэши.

2 голосов
/ 20 марта 2009

Ну, это не очень умно, так как это часть спецификации, но вы можете запустить ваши сервлеты при запуске Web App, добавив элемент load-on-startup в определение сервлета в web.xml:

<servlet>
  <description>....</description>
  <display-name>....</display-name>
  <servlet-name>....</servlet-name>
  <servlet-class>....t</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

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

Если этого недостаточно, если вы хотите загрузить классы из файлов JAR, например, без их реальной инициализации, и если вы знаете, где находятся ваши файлы JAR, или можете выяснить, где находятся ваши файлы JAR затем вы можете использовать что-то вроде кода в этом сообщении на форуме JCP "Список классов в пакете" или в некоторых более поздних публикациях в этой теме. Из списка классов вы можете получить объекты Class, которые помогут загрузить классы без необходимости создания экземпляра экземпляра.

1 голос
/ 20 марта 2009

Class.forName внутри потока потенциально может ускорить процесс. Начните с тех, которые находятся на первой странице, которая может быть нажата.

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

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

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

1 голос
/ 20 марта 2009

Class.forName () - это единственное, о чем я могу думать. Мне, конечно, было бы интересно услышать более умные альтернативы.

Еще один вариант - выбрать набор URL-адресов и запустить скрипт при запуске, чтобы попасть в эти URL-адреса.

0 голосов
/ 20 марта 2009

Может быть, вы можете попытаться преобразовать 700 классов в файл jar и применить некоторые методы для предварительной загрузки, возможно, поместив jar в путь к загрузочному классу (я не уверен, работает ли он ... но просто даю подсказку).

0 голосов
/ 20 марта 2009

Вы всегда можете использовать сторонний jsp-компилятор, такой как Jasper, для предварительной компиляции страниц JSP перед их развертыванием.

...