Как JVM начинает искать классы?
мне было интересно, что все местоположения JVM ищет для выполнения программы? Мне больше интересно понять, в какой последовательности и где JVM ищет файлы классов, например, заглядывает в Java-библиотеки, расширения, пути к классам в любой каталог, такой как текущий каталог, из которого вызывается java? Меня больше интересует поведение JVM, а не как класс loader load class, который, как я знаю, имеет Родительский механизм делегирования до root.
если a класс выполняется из каталога, где скомпилированный класс хранится в файловой системе, а также в файле jar в том же каталоге, будет ли JVM загружать оба или только один и какой?
скажем, у вас есть опасные нити
Vector
и если мы сравним его производительность сArrayList
, какой из них был бы лучше и почему?
5 ответов
Как найдены классы. Ответ здесь:
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/findingclasses.html
ответ для пункта 2: Порядок нахождения классов следующий:
- классы и пакеты в текущем каталоге.
- классы, найденные из переменной среды CLASSPATH. [переопределяет 1]
- классы найдены из-classpath параметр командной строки. [переопределяет 1,2]
- классы из архивов jar, указанных в опции командной строки - jar [переопределяет 1,2,3]
поэтому, если вы используете опцию-jar во время работы, классы поступают из jarfile.
загружается только один класс.
без использования дополнительного загрузчика классов:
- поиск заказа для JVM:
- классы времени выполнения (в основном,
rt.jar
на$JRE_HOME/lib
`) - классы расширения (некоторые банки в
$JRE_HOME/lib/ext
`) - Classpath, в порядке. Есть четыре возможности для указания пути к классам:
- если
-jar
было указано, что JAR находится в пути к классам. Любой путь к классам объявляется как путь к классам вMETA-INF/MANIFEST.MF
тоже продуманный. - еще, если
-cp
был указан, то есть путь к классам. - еще, если
$CLASSPATH
установлено, что в classpath. - Else, текущий каталог из которого
java
был запущен в classpath.
-cp src/A.jar:src/B.jar
, потомA.jar
сначала будет произведен поиск, затемB.jar
- если
- классы времени выполнения (в основном,
- JVM загружает только класс, который найден первым, в соответствии с порядком, в котором каталоги / банки объявлены в classpath. Это важно, если вы используете
-cp
или$CLASSPATH
. - в сценариях с одним потоком и с последними JVMs,
Vector
иArrayList
должен иметь аналогичную производительность (ArrayList
должен работать немного лучше, так как это неsynchronized
, но блокировка быстро в настоящее время, когда нет разногласий, поэтому разница должна быть небольшой). Во всяком случае,Vector
устарел: не используйте его в новом коде.
Я считаю, что Java смотрит в текущий каталог, а затем на путь к классу, согласно аргументу" - cp " VM. Вы можете поместить любую комбинацию папок классов (например, /project/bin/com/putable), конкретные файлы классов (например, /project/bin/com/putable/MyClass.класс) и файлы JAR (например, / project/lib / MyJar.банку) на пути к классу. Расположения разделяются двоеточием (ОС Unix) или точкой с запятой (ОС Windows). Так что все на пути к классам-это честная игра для Java при получении определений классов. Что касается последовательности, классы загружаются лениво. Таким образом, они загружаются только тогда, когда ваше приложение сначала требует их. Если ваше приложение не требует определенного класса во время выполнения, этот класс никогда не будет загружен.
Если вы ничего не помещаете в путь к классу, я думаю, что Java загрузится из файла класса, а не из Jar. Если вы укажете один или другой на пути к классам, то это место Java будет искать. Если вы поместите оба на путь к классам, поведение загрузки классов Java не определено, и оно может выбрать либо, в зависимости от реализации JVM.
зависит от того, что вы хотите сделать. Векторы на самом деле всегда потокобезопасны для Java API, поэтому, если вам не требуется параллельный доступ, ArrayList будет быстрее. Векторы и ArrayLists поддерживаются массивами, но они увеличивают емкость с разной скоростью (векторная емкость удваивается всякий раз, когда конец достигнуто и требуется больше места, но ArrayList увеличивается на 50%). В зависимости от того, как часто вы должны расти или уменьшаться, ответ будет отличаться. Проверить эту ссылку для получения дополнительной информации:
http://www.javaworld.com/javaworld/javaqa/2001-06/03-qa-0622-vector.html
меня больше интересует поведение JVM, а не загрузка загрузчика классов класс!--2-->
Извините, но это бессмысленно. Потому что ответ заключается в том, что JVM создает загрузчик классов и позволяет этому загрузчику классов загружать классы. Итак, чтобы понять "поведение JVM", вам нужно понять поведение загрузчика классов.
но, возможно, ваш вопрос был: как JVM создает загрузчик системного класса?
во-первых, по умолчанию система времени выполнения Java использует текущую работу
каталог в качестве отправной точки. Таким образом, если ваш пакет находится в подкаталоге текущего
каталог, он будет найден. Во-вторых, можно указать путь к каталогу или пути, установив
Переменная среды CLASSPATH. В-третьих, вы можете использовать параметр-classpath с java
и javac, чтобы указать путь к классам.
например, рассмотрим следующую спецификацию пакета:
пакет MyPack ;
Для того, чтобы программа нашла MyPack, одна из трех вещей должна быть правдой. Либо программа
может выполняться из каталога непосредственно над MyPack, или путь к классам должен быть
установите для включения путь к MyPack, или параметр-classpath должен указать путь к MyPack
когда программа запускается через java.
При использовании вторых двух параметров путь к классу не должен включать в себя MyPack. Он
необходимо просто указать путь к MyPack. Например, в среде Windows, если путь
для MyPack это
C:\MyPrograms\Java\MyPack
тогда путь класса к MyPack
C:\MyPrograms\Java
самый простой способ попробовать приведенные примеры-создать пакет
каталоги, текущий каталог развития, поставить .файлы классов в
соответствующие каталоги, а затем выполнить программы из каталога разработки.
Такой подход используется в следующем примере.