Является ли большой путь класса нескольких (возможно, даже неиспользуемых) файлов jar неэффективными - программирование
Подтвердить что ты не робот

Является ли большой путь класса нескольких (возможно, даже неиспользуемых) файлов jar неэффективными

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

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

Делают ли файлы Jar загружаться в память, вызывая ненужное использование из-за того, что большинство классов никогда не используются? Будет ли он оставаться в памяти?

Является ли ссылка на каталог лучшим вариантом? Или файл Jar уже распакован во временное место для начала?

Быстрее ли использовать метод каталога, чем метод файла Jar?

Можно ли извлечь все файлы Jar в один каталог, чтобы уменьшить количество мест в пути класса? Когда это хорошая идея?

4b9b3361

Ответ 1

Центральные каталоги файлов jar файла (помещенные в конец zips) будут проанализированы и загружены в память. Каталог является плоским, поэтому все его необходимо загрузить. Значительная часть задержки при запуске простого процесса Java - это открытие rt.jar, которое огромно. Итак, да, что там началось время и память наверху.

Поиск каждого класса должен быть постоянным. Тем не менее, существуют некоторые O (n) алгоритмы. Таким образом, для приложения в целом O (n ^ 2) для загрузки класса (хотя константа довольно мала и может быть во власти линейных временных операций).

Выполнение доступа к файлам при загрузке файлов будет неэффективным. JDK использовал zip для системных классов перед банками.

(Загрузка классов может произойти некоторое время до статической инициализации, когда статический инициализатор будет запущен, если он присутствует - см. три аргумента Class.forName.)

Ответ 2

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

В случае большого количества JAR меня больше беспокоит JAR Hell.

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

Я думаю, что ответ гладкого регги хорош для некоторых дополнительных подробностей в теме загрузки классов.

Ответ 3

Как найдены классы и глава по загрузке, связыванию и инициализации в спецификации JVM являются полезными ссылками.

Из личного опыта я могу подтвердить, что чем дольше ваш classpath для javac, тем больше времени ваша компиляция займет; это особенно проблема, когда в classpath есть JAR, которые не требуются для компиляции. Для простого теста попробуйте выполнить компиляцию канонического HelloWorld.java без -cp, при этом несколько JAR файлов добавлены в -cp, а затем с несколькими JAR файлами, добавленными в -cp; время, затраченное на компиляцию, увеличивается, когда число JAR в списке -cp увеличивается.