Подтвердить что ты не робот

Ускорить запуск приложения, добавив собственные классы приложений в классы .jsa

Чтобы ускорить время запуска JVM, разработчики Sun решили, что рекомендуется предварительно скомпилировать стандартные классы выполнения для платформы во время установки JVM. Эти предварительно скомпилированные классы можно найти, например. по адресу:

$JAVA_HOME\JRE\Bin\клиент\classes.jsa

Моя компания в настоящее время разрабатывает автономное приложение Java, которое привносит свою собственную JRE, поэтому было бы фантастическим вариантом ускорить время запуска приложения, добавив также свои собственные классы приложений в этот файл jsa.

Я не верю, что JSA файл был создан магией, поэтому: как он создан? И как я могу обмануть JVM для включения моих собственных классов?

EDIT: я уже выяснил следующее:

Класс .jsa создается командой

java -Xshare:dump

Список классов для включения в дамп можно найти в $JAVA_HOME/jre/lib/classlist.

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

Последняя проблема: только классы в пакетах java, com.sun и org.w3c кажутся узнаваемыми, если я оставляю одни и те же классы в своих исходных пакетах, они не будут загружены. Я искал весь источник OpenJDK для указателя об этом, но, похоже, он имеет какое-то отношение к доменам защиты. Если кто-то заинтересован в этой теме и достаточно хорошо осведомлен, добавьте несколько указателей для меня, чтобы продолжить исследование.

4b9b3361

Ответ 1

Начиная с Java 8u40 (и Embedded Java 8u51), Java теперь поддерживает совместное использование данных класса приложений (AppCDS) (т.е. ваши собственные классы в общем архиве). На нашем встроенном java мы обнаружили повышение производительности на 40%! Довольно потрясающе для почти никакой работы с нашей стороны...

https://blogs.oracle.com/thejavatutorials/entry/jdk_8u40_released

Ответ 2

Вы были почти там, вам нужно всего лишь пару шагов, чтобы заставить его работать. Чтобы добавить свои собственные классы к clients.js, вам понадобятся следующие шаги:

  • Квалифицированное имя ваших классов (у вас есть)

  • Путь к классам этих классов (у вас есть)

  • Знайте, как пересчитать контрольную сумму (у вас есть)

  • Сбросьте новый файл, предоставив путь класса к классам, которые вы сейчас предварительно компилируете с помощью классов Java.

  • Запустите программу, предоставив тот же путь к классам, который вы использовали для сброса новых классов. jsa

Чтобы предоставить путь к классам, где находятся классы, которые вы добавляете в список классов, используйте команду -Xbootclasspath/a. Он добавит каталоги /JAR, когда JVM будет искать места, где находятся классы загрузки. По умолчанию пространство для classes.jsa довольно мало, если вам нужно его улучшить, вы можете использовать команды -XX:SharedReadWriteSize и -XX:SharedReadOnlySize. Команда дампа выглядит примерно так:

java -Xshare:dump -Xbootclasspath/a:C:/myfiles/directoryA/;C:/myfiles/directoryB/;C:/myJars/myJar.jar;

Последний шаг - просто запустить Java-приложение, как правило, перезапустить режим совместного доступа. Вам также нужно добавить excelly Xbootclasspath, как вы добавили на дампе. Он будет выглядеть примерно так:

java myapp.java -Xshare:on -Xbootclasspath/a:C:/myfiles/directoryA/;C:/myfiles/directoryB/;C:/myJars/myJar.jar;

Теперь каждый класс, который вы помещаете в список классов, делится с другими экземплярами, запущенными в одной JVM.

Ответ 3

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

Как для самого себя, кажется, этот файл обычно создается, когда установлена ​​Sun VM, но вы также можете управлять им. Некоторые детали находятся в этом более раннем документе Sun Java 5 Class Data Sharing (который вы, возможно, уже видели?). Некоторые Sun Java 6 docs также упоминают об этом несколько раз, но не добавляют много к документации. Кажется, это изначально было функцией IBM VM. И, чтобы продолжить дамп ссылок, он немного объяснил в этой статье.

Я лично мало знаю об этом, поэтому я не знаю, как вы могли бы его контролировать. Вы можете восстановить его, но я не думаю, что он предназначался для вас, чтобы вставлять пользовательские материалы. Кроме того, даже если вы можете "обмануть" его, это, вероятно, нарушит какую-либо лицензию Sun/Oracle (например, вы не можете использовать rt.jar и перераспределять). И, все, что сказал, я сомневаюсь, что вы увидите серьезное улучшение времени запуска, если у вас нет тысяч или десятков тысяч классов в вашем приложении?

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