Мне кажется, что называть выступление One-Jar ужасным и плохим - несправедливо. Для приложений среднего размера можно ожидать, что запуск займет пару секунд дольше (хотя это не влияет на заставку JVM). Объем памяти, превышающий десятки мегабайт, незначителен для большинства сред, за исключением, возможно, встроенных систем. Кроме того, One-Jar способен автоматически извлекать некоторые файлы в файловую систему, что избавляет от необходимости разрабатывать установщик в моем случае.
Ниже приведена попытка количественно оценить влияние производительности, представленное One-Jar для моего приложения. Это приложение с графическим интерфейсом на основе Swing, состоит из 352 классов, скрытых с помощью ProGuard 4.5b2. One-Jar 0.96 используется для объединения результирующих классов с библиотеками объемом 12 МБ (ODFDOM, Saxon HE, Xerces, Jaxen, VLDocking, Apache Commons и т. Д.). Я сравнил производительность запутанной банки с той же самой банкой, обработанной One-Jar.
- От JVM до начала метода main (): 0,5 с без One-Jar и 1,7 с с One-Jar. От JVM начните до появления окна приложения на экране: 2.3 с без One-Jar и 3.4 с с One-Jar. Таким образом, One-Jar добавляет 1.1s ко времени запуска.
- One-Jar не увеличит задержку между запуском JVM и заставкой, появляющейся на экране (если реализовано через манифест jar), поэтому увеличение времени запуска не слишком раздражает для интерактивных приложений.
- Мы говорим о загрузчике классов, поэтому это не должно влиять на скорость выполнения кода, если вы не используете интенсивную загрузку классов.
- Просмотр статистики JVM (через jconsole) показывает, что версия One-Jar'red занимает больше динамической памяти. Для моего приложения накладные расходы составляют порядка десятков МБ. Я видел такие цифры, как 16 МБ против 40 МБ, 306 МБ против 346 МБ, 131 МБ против 138 МБ, в зависимости от того, сколько пользовательских данных обрабатывается приложением, а теперь уже давно запущен сборщик мусора.
Приведенное выше время было получено путем взятия временной метки непосредственно перед запуском JVM из оболочки Linux, в начале метода main () и в обработчике события windowOpened () моего окна приложения. Измерения проводились на не очень быстром ноутбуке D820 с двухъядерным процессором 1 ГГц и 2 ГБ или ОЗУ под управлением Ubuntu 8.04.
Надеюсь, это поможет.