2010-01-07 2 views
12

Предположим, у меня есть 500 файлов jar, связанных с моей программой на общую сумму более 500 МБ (размер всех банок, а не каждый), и моя программа делает вызов класса, расположенного в одном из них. Как Java ищет через jars для класса, и какова эффективность этого? На)? O (журнал (п))?Как Java эффективно ищет файлы jar для классов?

ответ

10

Java ищет во внутренней структуре каталогов банку для точного соответствия по полному имени. Это выглядит; он не ищет. Если у вас есть 500 файлов jar в пути к классам, Java будет выглядеть в них один за другим в указанном порядке, пока не найдет совпадение. Если jar, содержащий данный класс, является последним, Java будет выглядеть в 500 файлах jar. Поэтому я думаю, что это O (n).

ОБНОВЛЕНИЕ: Поведение, описанное выше, является поведением по умолчанию. Однако, как отметил Хасан, это можно оптимизировать, предоставив JarIndex в файле корневого jar, позволяя загрузчику классов найти правильный файл jar с простым поиском по имени пакета.

+0

В Java 7 они пытаются выкупить это, поддерживая модульную систему, аналогичную OSGi – notnoop

+0

(-1), которая устарела. –

+1

@ Хасан. Индексы являются необязательными, по умолчанию действительно линейно: новая схема загрузки классов полностью обратно совместима с приложениями, разработанными поверх существующего механизма расширения. Когда загрузчик классов загружает первый файл jar и файл INDEX.LIST находится в каталоге META-INF, он будет строить таблицу хеш-индекса и использовать новую схему загрузки для расширения. В противном случае загрузчик классов будет просто использовать оригинальный алгоритм линейного поиска. – djna

7

По умолчанию он был линейным; однако, поскольку JDK 1.3 индекс JAR может быть встроен в первый файл JAR приложения.

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

ссылка на SUN Resource на индексирование JAR. Примечание. Ресурсы неклассификации, похоже, не покрываются.

+0

Вы считаете, что использование индексов является общим? Я думаю, что все еще линейное поведение по умолчанию, вам нужно добавить индекс, и многие люди этого не делают. – djna

+0

Все почтовые индексы имеют индекс в конце файла, так что это не имеет большого значения. –

+0

hmm. Кажется, ANT по умолчанию присваивает значение http://ant.apache.org/manual/CoreTasks/jar.html false для генерации индекса в JAR-файлах. Интересно, что делают IDE? –

Смежные вопросы