Что происходит при запуске программы java?

недавно были затронуты Java classloaders и внезапно признали, что не полностью понимают, что происходит пошаговую инструкцию когда кто-то называет

java -jar App.jar

Ну, я думаю,

  1. создается новый экземпляр JVM
  2. он использует ClassLoader для загрузки основного класса и других классов
  3. байт-код запускается для выполнения из метода main ()

но все же я полагаю, что есть много вещей, которые мне нужно знать больше об этом.

  • кто и как решает, какие классы должны быть загружены при запуске и что еще нужно?

Я нашел два связанных вопроса, но там не объясняется, как применить это к реалиям Java.

что происходит при запуске компьютерной программы?

что происходит, когда вы запускаете программу?

4 ответов


•кто и как решает, какие классы должны быть загружены при запуске и что еще нужно?

нам нужно понять основы загрузки классов java. Первоначально загрузчик классов bootstrap (он реализован изначально как часть самой виртуальной машины) отвечает за загрузку основных системных классов. Затем есть другие загрузчики классов, такие как расширение, система, пользовательские (необязательные) загрузчики классов, которые решают, когда и как классы должны быть нагруженный. основы загрузки класса


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

класс только должен загружается при первом доступе из программного кода; этот доступ может быть экземпляром объекта из этого класса или доступом к одному из его static членов. Обычно загрузчик классов по умолчанию будет лениво загружать классы, когда они необходимый.

на некоторые классы нельзя полагаться для предварительной загрузки в любом случае: классы доступны через Class.forName(...) не может быть определено, пока этот код не будет фактически выполнен.

среди других опций, для простых экспериментов, вы можете использовать статический код инициализатора, чтобы посмотреть на фактическое время и порядок, в котором классы фактически загружены; этот код будет выполняться, когда класс загружается в первый раз; пример:

class SomeClass {

    static {
        System.out.println("Class SomeClass was initialized.");
    }

    public SomeClass() {
        ...
    }

    ...

}

ваш пример показывает исполняемый jar, который является просто обычным архивом java( jar) с дополнительной парой ключ/значение в его файле манифеста (находится в папке "META_INF"). Ключ "Main-Class "и значение полного имени класса того класса, метод" main "которого будет выполнен, если вы" запустите " jar так же, как в вашем примере.

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


всякий раз, когда вы компилируете программу Java, выполняются следующие шаги

  1. сначала загрузчик класса загружает класс в JVM.
  2. после подачи команды имя файла javac.java компилятор проверяет ошибки времени компиляции, и если все в порядке, то он будет генерировать .Class-файлов(байт-код).

Это будет первый этап.

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

первая фаза в java выполняется компилятором JIT (Вовремя).