Статьи

Сокращение занимаемой площади Java SE: сокращение стандартной версии Java

В предыдущем посте в моем блоге было продемонстрировано, как можно с минимальными усилиями уменьшить занимаемую дисковую площадь типичной среды выполнения Java SE 5.0 примерно на треть без нарушения лицензионного соглашения Java Standard Edition . В этом посте основное внимание было уделено удалению необязательных файлов и сжатию jar-файлов библиотеки классов. Оказывается, что при немного большем количестве инженерных разработок у вас есть значительные возможности для дальнейшей оптимизации пространства.

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

Безголовая конфигурация

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

  • Не поддерживает ввод с клавиатуры или мыши
  • Невозможно создавать окна или отображать графику
  • Бросьте исключение HeadlessException при вызове графического API
  • Все еще поддерживает функциональный Java 2D API для печати и рендеринга за пределами экрана.
  • Все еще на 100% совместимы с Java SE

Устранить клиент или серверный компилятор

Реализации Sun Java SE включают два компилятора HotSpot, настроенные и предназначенные для конкретных сред. Клиентский компилятор фокусируется на таких вещах, как быстрая интерактивность пользователя и быстрый запуск, тогда как приоритет компилятора сервера заключается в оптимизации больших и долгоживущих серверных приложений. Виртуальная машина Java SE может одновременно использовать только один из этих компиляторов, поэтому удаление неиспользуемого может сэкономить значительное пространство.

Минимизирует потребление памяти

Стандартная Java SE выделяет ОЗУ для размещения таких вещей, как кэш кода JIT и куча объектов. По умолчанию каждой из этих областей (и других) может быть назначено 64 МБ. Во встроенной платформе, где общий объем оперативной памяти может составлять только 64 МБ, Java SE просто не будет иметь достаточно памяти для запуска. Java SE Embedded, с другой стороны, автоматически адаптирует использование памяти в зависимости от объема доступной оперативной памяти. Следовательно, 64 МБ — это разумный объем ОЗУ для большого набора встроенных Java-приложений.

Пространство против скорости компромиссов

(1) Java SE реализует таблицу поиска потоков, которая, с точки зрения непрофессионала, помогает сохранить несколько инструкций при переключении между потоками Java. Исключив эту таблицу, можно сэкономить пару МБ ОЗУ из рабочего набора вашего приложения.

(2) Java SE также выделяет область (mmap’ed) для загрузки jar-файлов в оперативную память, что, как мне объяснили, может повысить производительность, но также может привести к дублированию копий jar-файлов в памяти. Удаление этой области еще больше уменьшает размер резидентного набора.

Пример

Завершив пример из предыдущего поста, давайте начнем с неизмененной версии Java SE 5.0 Update 13 для Linux / x86 . По умолчанию статический размер составляет около 88 МБ.

   jimc @ jalopy: / tmp> du -sk
   ./jre1.5.0_13/ 88185 ./jre1.5.0_13/

Следуя указаниям в предыдущем посте , мы можем уменьшить его примерно до 60 МБ.

   jimc@jalopy:/tmp> du -sk /tmp/jre1.5.0_13/
59358 /tmp/jre1.5.0_13/

Загрузка сокращенной версии Sun Java SE для x86 / Linux дает:

   jimc@jalopy:/tmp> du -sk /tmp/jre1.5.0_10/
31003 /tmp/jre1.5.0_10/

Эта версия JRE составляет примерно одну треть от ее первоначального размера, и, кроме того, она была модифицирована таким образом, чтобы использовать значительно меньше памяти, чем стандартные предложения Java SE. Примечание: мы сравниваем слегка отличающиеся обновления Java SE 1.5 (обновление 13 и обновление 10). Они действительно не идентичны, но их разногласия следует считать, ради аргумента, незначительными.

[1] Большое спасибо Бобу Вандетту, который через презентацию и беседу предоставил эту информацию. Одним из многих источников является сеанс Боба Java ONE 2007, который называется « Развертывание Java Platform Standard Edition (платформа Java SE)» на современных встроенных устройствах (TS-2602).

Спасибо Джиму Коннорсу за разрешение переиздания этой статьи на JavaLobby.