Как 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: Порядок нахождения классов следующий:

  1. классы и пакеты в текущем каталоге.
  2. классы, найденные из переменной среды CLASSPATH. [переопределяет 1]
  3. классы найдены из-classpath параметр командной строки. [переопределяет 1,2]
  4. классы из архивов jar, указанных в опции командной строки - jar [переопределяет 1,2,3]

поэтому, если вы используете опцию-jar во время работы, классы поступают из jarfile.

загружается только один класс.


без использования дополнительного загрузчика классов:

  • поиск заказа для JVM:
    1. классы времени выполнения (в основном,rt.jar на $JRE_HOME/lib`)
    2. классы расширения (некоторые банки в $JRE_HOME/lib/ext`)
    3. Classpath, в порядке. Есть четыре возможности для указания пути к классам:
      1. если -jar было указано, что JAR находится в пути к классам. Любой путь к классам объявляется как путь к классам в META-INF/MANIFEST.MF тоже продуманный.
      2. еще, если -cp был указан, то есть путь к классам.
      3. еще, если $CLASSPATH установлено, что в classpath.
      4. Else, текущий каталог из которого java был запущен в classpath.
      Итак, если я укажу -cp src/A.jar:src/B.jar, потом A.jar сначала будет произведен поиск, затем B.jar
  • JVM загружает только класс, который найден первым, в соответствии с порядком, в котором каталоги / банки объявлены в classpath. Это важно, если вы используете -cp или $CLASSPATH.
  • в сценариях с одним потоком и с последними JVMs, Vector и ArrayList должен иметь аналогичную производительность (ArrayList должен работать немного лучше, так как это не synchronized, но блокировка быстро в настоящее время, когда нет разногласий, поэтому разница должна быть небольшой). Во всяком случае,Vector устарел: не используйте его в новом коде.

  1. Я считаю, что Java смотрит в текущий каталог, а затем на путь к классу, согласно аргументу" - cp " VM. Вы можете поместить любую комбинацию папок классов (например, /project/bin/com/putable), конкретные файлы классов (например, /project/bin/com/putable/MyClass.класс) и файлы JAR (например, / project/lib / MyJar.банку) на пути к классу. Расположения разделяются двоеточием (ОС Unix) или точкой с запятой (ОС Windows). Так что все на пути к классам-это честная игра для Java при получении определений классов. Что касается последовательности, классы загружаются лениво. Таким образом, они загружаются только тогда, когда ваше приложение сначала требует их. Если ваше приложение не требует определенного класса во время выполнения, этот класс никогда не будет загружен.

  2. Если вы ничего не помещаете в путь к классу, я думаю, что Java загрузится из файла класса, а не из Jar. Если вы укажете один или другой на пути к классам, то это место Java будет искать. Если вы поместите оба на путь к классам, поведение загрузки классов Java не определено, и оно может выбрать либо, в зависимости от реализации JVM.

  3. зависит от того, что вы хотите сделать. Векторы на самом деле всегда потокобезопасны для 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

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