2016-09-21 19 views
3

Скажите, что я запускаю веб-сервер (или любой другой Java-процесс), будет ли загружаться весь класс (метаданные, такие как определение класса) при запуске сервера/процесса еще до , они используются в любом месте системы или загружаются во время выполнения, т. Е. только в том случае, когда объект создается или оператор импорта встречается?Когда класс загружен JVM?

Этот вопрос для JDK 8 и JDK 6

+0

См. [Спецификация виртуальной машины Java № 5] (http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-5.html). – EJP

ответ

0

Прежде всего, в байткод, нет импорта заявления. Bytecode просто использует полные имена по всему месту.

Тогда поведение большинства JVM по умолчанию - это «ленивая» загрузка классов. Значение: когда вы загружаете класс A, JVM будет загружать только те классы, которые необходимы для запуска всех статических инсайдеров для A.

Итак, если A использует «B» и «C»; то B, C загружаются только тогда, когда JVM выполняет код, который требует B соответственно. C для загрузки.

При написании вашего класса вы можете, конечно, поступить по-другому.

+0

, поэтому они загружаются во время выполнения, когда и когда они ссылаются. Правильно ? – emilly

+0

Да, это было бы правильным способом сказать, что происходит. – GhostCat

0

см Class loading architecture

Вот соответствующие строки в контексте вашего вопроса

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

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

0

JVM выполняет ленивую загрузку классов. Значения классов загружаются, поскольку они требуются напрямую ИЛИ КОСВЕННО.

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