{java} Java Language Specification





Java Language Specification, 12. Execution.

12.1 Запуск виртуальной машины.
12.5 Создание новых экземпляров класса
12.6 «Утилизация» (finalization) объектов.
12.7 Выгрузка (unloading) классов и интерфейсов.


12.1 Запуск виртуальной машины.
JVM начинает выполнение вызова метода main указанного класса.

Шаги:
1. Загрузка класса
При первом попытке вызова метода, обнаруживает, что класс ещё не загружен, вызывается class loader.
Загрузка — это процесс поиска бинарной формы класса или интерфейса (возможно с вычислением на лету, но обычно уже скомпилированной версии) и создание объекта Class, который представляет указанный класс или интерфейс.
Бинарный формат — это либо class file format из JVM Specification, но может быть любой другой, который удовлетворяет требованиям из JLS 13.1.
Метод defineClass из ClassLoader может быть использован для создания объекта Class из бинарной формы class file format.
Корректный class loaders должен по одному и тому же имени класса loader всегда выдает один и тот же class object (разные объекты тоже пройдут, JVM специально обходит такие случаи).
Загрузка реализуется ClassLoader и его подклассами (в различных подклассах могут быть реализованы всякие оптимизации, например, кэширование классов или загрузка сразу нескольких классов за шаг).

Шаг 2. Линковка: проверка, подготовка, и возможно разрешение ссылок (Resolve).
Подробности можно смотреть в JVM Specification, глава 5.
Состоит из:
2. 1. Verify.
Проверяется правильность представления класса: верная таблица символов, код удовлетворяет семантическим требованиям языка и виртуальной машины.
В том числе проверяет, что каждая инструкция имеет правильный opcode, каждая операция ветвления указывает на начало какой-то другой инструкции, каждый метод имеет структурно корректную сигнатуру, каждая инструкция подчиняется правилам типов JVM language.
2. 2. Prepare.
Подготовка включает в себя создание статических полей (переменных и констант) и инициализации их значениями по умолчанию (без выполнения исходного кода, даже инициализаторов).
А так же создание всех структур данных, которые используются виртуальной машиной (таблица методов)

2. 3. Разрешение символических ссылок на другие классы и интерфейсы.
Т.е. загружаем их и проверяем, что ссылки корректны.
Этот шаг на стадии линковки опционален. В зависимости от VM, может произойти полная загрузка и разрешения всех ссылок на классы рекурсивно, а может только тех ссылок, которые активно используются.

Шаг 3. Инициализация (12.4)
Выполнение всех инициализаторов переменных класса или интерфейса, а также статических инициализаторов (это только для класса), in textual order (я так понимаю, как они идут в тексте?), при этом в них нельзя использовать те переменные класса, которые объявлены позже в тексте.
Перед этим должен быть проинициализирован родительский класс (и так далее рекурсивно). Инициализация реализуемых интерфейсов не нужна.
Инициализация происходит сразу, когда выполняется одно из условий:

  • 3.1. создается экземпляр класса
  • 3.2. вызван статический метод этого класса
  • 3.3. присвоено значение статическому полю класса
  • 3.4. статическое поле класса использовано, при этом поле — не константа.
  • 3.5. вызов определенных методов в классе Class или в java.lang.refrlect.

Так как язык Java поддерживает многопоточность, при написании инициализаторов нужно учитывать возможность одновременной инициализации класса несколькими потоками.
JVM берет на себя заботу о синхронизации и рекурсивной инициализации (init A->method B->init B->method A). Подробности в JLS.

Шаг 4. Вызов метода public static void main(String[] args)
Он может быть определен и как public static void main(String… args)

12.5 Создание новых экземпляров класса
Либо явно как результат выполнения class instance creation expression (см. 15.9), либо неявно для случая строк (чтобы хранить текстовый литерал или как результат конкатенации) или в результате boxing.

При создании нового экземпляра выделяется память для всех переменных объекта, включая определенные в подклассах, даже которые скрыты. Сначала эти переменные инициализируются значениями по умолчанию. После этого вызывается нужный конструктор:
1. Если в нем сначала прописан другой конструктор этого класса, то вызываем его.
2. Вызываем конструктор родительского класса (если он в коде не указан, то вызывается конструктор по умолчанию super()).
3. Если мы не вызывали другой «свой» конструктор, то инициализируем переменные класса: присваиваем значения полям объекта в порядке слева направо как они появляется в тексте класса.
4. Выполняется оставшаяся часть конструктора.

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

12.6 «Утилизация» (finalization) объектов.
В классе Object есть protected finalize(), который можно переопределять. Он вызывается JVM перед тем, как удалить объект от GC.
НО в Java нет указаний, как скоро будет вызван finalizer. И нет указаний о порядке вызовов таких методов.
Всякие дополнительные подробности см. в самой JLS.

12.7 Выгрузка (unloading) классов и интерфейсов.
В принципе, в JVM можно выгружать классы и интерфейсы, но только те, у которых class loader может быть удален? (reclaimed by the) GC. Те классы, которые загружен стандартным class loader, не могут быть выгружены.
Доводы и объяснения см. в JLS.








































Вам это будет интересно!

  • {java puzzler} инициализация классов и конструирование объектов
  • Начинающим Java программистам
  • {java puzzlers} Josh Bloch: Java Puzzlers Epizode VI
  • Post form from java use Socets
  • {java puzzlers} Joshua Bloch: Tiger Trap
  • Последние новости

    Слово

    Назови человека свиньей, и он захрюкает. Пословица Проживая данную нам жизнь, мы все время находимся в гуще энергий, как положительных, так и отрицательных. По этическим нормам слово обладает определенной силой, следовательно, когда мы клевещем на человека, судим, обзываем, мы «де...
    Читать далее »

    ЭГРЕГОР

    Энергия эгрегора – квантовая структура, которая сформирована мыслями, знаниями и чувствами всего человечества – бывшего, настоящего и будущего. Эгрегор – это квантово лептонная скоррелированная структура, рожденная похожими мы...
    Читать далее »

    Как открыть свои чакры

    Открытие чакр увеличивает поток энергии в теле и вокруг него и, следовательно, улучшает наше физическое, ментальное и эмоциональное здоровье. Представьте себе каждую чакру по очереди. Они вращаются и становятся больше в размере. Начинайте с 1 – й чакры (пусть они вращаются в любую сторону, обычно они вращаются в разные). В то же ...
    Читать далее »

    Смерть или новая жизнь

    Из разговора двух зародышей в утробе матери: – Как ты думаешь, есть ли жизнь после родов? – Не знаю, оттуда еще никто не возвращался… Сравнительно недавно появились сенсационные сообщения доктора Раймонда А. Моуди о том, что ученые зарегистрировали фа...
    Читать далее »

    Чакры

    Чакры являются основными энергетическими органами биополя. Они контролируют нашу деятельность во внешнем мире, а каждая из чакр несет ответственность за определенную сферу деятельности. Основное предназначение их заключается в том, что они несут ответственность за поддержание энергообмена живого организма с окружающей средой через специальные каналы связи. Таким образом, при нарушении процесса энергообмена у нас возникают болезни и проблемы...
    Читать далее »

    Три колонны космоса

    Показания: нарушение обменных процессов, снижение иммунитета, обновление сил. Методика исполнения. Средний и сердечный пальцы правой руки кладут на аналогичные пальцы левой руки. Мизинец левой руки кладут возле основания тыльной поверхности среднего и безымянного пальцев правой руки, затем все фиксируется мизинцем правой руки. Кон...
    Читать далее »

    Заключение

    Лучше зажечь свечу, чем проклинать сгущающуюся тьму. Дзенское изречение Вот и написана книга. Мне хочется верить, что вам она обязательно поможет в познании себя, утверждении своего «Я», определении своего места во Вселенной. На ум приходит китайская пословица: «Если не менять направление, мы наверняка достигнем того, к чему идем». А мы идем к Свету, Добру и Счастью. Мы ...
    Читать далее »
    Семейный водитель москва
    Описание услуг агентства, порядок подбора персонала. Резюме и вакансии.
    ayuto.ru