Хорошие программисты доля механизм виртуальной машины Java Java загрузки класса

связанные с JVM понятия

  • JDK <br> в JDK (Java Development Kit) набор Java Development, представляет собой набор разработчиков Java набор процедур для компиляции и отладки программ.

  • JRE <br> JRE (Java Runtime Evironment) Java Runtime Environment, является платформой для запуска программ Java, все программы Java могут быть выполнены только в этой платформе.

  • виртуальная машина <br> в JVM (Виртуальная машина Java) Виртуальная машина Java, вне виртуальных компьютерных кодов , моделирующих функций , выполняемых компьютером, он имеет свою собственную архитектуру аппаратных средств, таких как: процессор, стек, регистры и т.д., а также свои собственные набор инструкций на различных операционных системах может быть установлена JVM, что позволяет Java программы могут выполняться на разных операционных системах, JVM является достижение возможности кросс-платформенные Java.

Процесс загрузки классов JVM

Мы разработали выполнение программы Java, вам необходимо скомпилировать , а затем выполняется, JVM отвечает за процесс загрузки класса. <br> класс процесса погрузчик делятся на:

  1. нагрузка

  2. верификация

  3. готовый

  4. решение

  5. инициализация

Процедура загрузки ПОДРОБНОЕ класс

Следующие детали в соответствии с этими процедурами:

  1. Нагрузка <br> в процессе загрузки класса для завершения:

    1. В соответствии с полным именем класса спецификатора, получить класс двоичный поток, поток может, баночка файлы, полученные из класса на диске, могут быть также получены из сети.

    2. Динамическая структура хранения данных, когда структура класса статической операции хранения в области методы

    3. В динамической памяти, чтобы генерировать соответствующие объекты java.lang.Class, способ в качестве входной области

  2. Проверка <br> После загрузки класса завершен, введите процесс верификации, который гарантирует , что информация , полученная в предыдущем объекте класса не будет ставить под угрозу безопасности виртуальной машины Java. <br> аспекты должны быть проверены , являются:

    1. Проверка формат файла для проверки соответствия формата файла байт спецификации класса потока, и может быть текущая версия обработки виртуальной машины. Магическое число, чтобы проверить, является ли 0xCAFEBABE; большой и малый номер версии является текущим диапазона обработки виртуальной машины, если нет постоянного типа поддерживается постоянным в постоянном бассейне и т.п., основной целью является обеспечение входного байта проверки фаз течь должным образом обработать и находится в области процесса, проходят проверку подлинности на данном этапе, поток байт будет ввести метод хранения в области памяти, так что последние три основаны способ конфигурирования области памяти проверка фазы выполняется.

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

    3. проверка байт-код, основная задача которого является поток данных и поток управления, чтобы обеспечить анализ класса валидации методы во время выполнения не будет делать виртуальную машину действует под угрозой безопасность. Если тело метода байт-код не проходит проверку класса байткода, это, конечно, проблема, но если тело метода в байтах кода верификаторе не может объяснить это обязательно безопасно.

    4. Проверка символических ссылок, будет иметь место в виртуальной машине, когда символические ссылки на прямые ссылки, это действие преобразования будет происходить в «аналитической фазе». Символьные ссылки на классы, поля и метода; символ проверки строка, описанные со ссылкой на власть именования, если соответствующий класс может быть найдены, есть ли способ, в соответствии с методом, указанным дескриптором поля именем класса и простым описанием полех и доступность (частное, защищенный, общественность, по умолчанию), можно ли получить доступ текущего класса.

  3. Получение <br> фазового метода подготовки выделяет область памяти для переменных статических классов и назначить значения по умолчанию.

    общественности статической счетчик INT = 100;

    Такие, как: выше количества переменной на этапе подготовки будет присвоен 0, а затем присваивается 100 во время инициализации;

  4. Устраните <br> разборе этап представляет собой виртуальную машину для постоянного пула символических ссылок на процесс замены прямых ссылок.

    • Ссылочная (Символическое Reference) <br> символическая ссылка на определенный набор символов , описанных в ссылочных, буквенных символов может быть в любой форме, может быть установлен однозначно, пока цель использования. Символ ссылка не имеет ничего общего с макетом памяти для достижения виртуальной машины, цель не обязательно ссылка была загружена в память.

    • Прямая ссылка (Прямая ссылка) <br> прямая ссылка может быть прямым указателем на объект, относительное смещение или косвенно направлена для обработки целей. Прямая ссылка на макет памяти связана с реализацией виртуальной машины, если у вас есть прямая ссылка, целевая ссылка должна уже существовать в памяти.

  5. Инициализация <br> инициализация класса является заключительным этапом в процессе загрузки класса, в передней части процесса загрузки класса, в дополнении к другим , чем с помощью загрузчика классов самоопределяемым участвовать в оставшихся действиях полностью доминируют управления машины и пользовательские приложения виртуальными в фазе загрузки. На этапе инициализации, действительно начал классы , определенные в Java коде. <br> инициализации фазы выполняется конструктор класса <clinit> метод процесса (). <Clinit> () метод собирается автоматически с помощью операции присваивания класса компилятор всех классов и статических переменных блока операторов (статический {} блок) сливаться заявления сгенерированные.

    Поэтому, когда для выполнения инициализации его?

    1. Создание экземпляра класса

    2. Класс доступа статические переменный ( за исключением постоянной, окончательной модифицированной) причины: Constant специального переменный, так как компилятор обрабатывает их как значения свойств , а не для лечения.

    3. Класс доступа статический метод

    4. Отражатель (Class.forName ( "com.test.Person"))

    5. При инициализации класса, класс еще не нашел его инициализацию отца, первый вызов для инициализации родительского класса

    6. При запуске виртуальной машины, определение метода Main (), чтобы инициализировать класс

Код случаи

Понять механизм загрузки классов, мы смотрим на лицо вопросы:

общественный класс MySingleton {  частный статический MySingleton одноточечно = новый MySingleton (); открытые статические INT count1 = 0; открытые статические INT count2; частный MySingleton () { count1 ++; count2 ++; } Общественности статической MySingleton деЫпзЬапсе () { возвращение одноточечно; } Государственной статической силы основных (String [] арг) { MySingleton одноэлементный = MySingleton.getInstance (); System.out.println ( "count1 ->" + MySingleton.count1); System.out.println ( "count2 ->" + MySingleton.count2); } }





















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


count1 -> 0
count2 -> 1

Почему это? Теперь мы должны проанализировать:

  1. Во- первых , мы знаем , присвоит значения по умолчанию для статических переменных в фазовом классе подготовки: <br> Синглтон = NULL; count1 = 0; count2 = 0;

  2. Когда деЫпзЬапсе статический метод вызова класса, инициализация класса срабатывает, выполнить новую MySingleton () метод вызова конструктора, а затем: <br> count1 является = 1;. Count2 1 =;.

  3. Продолжайте инициализировать, присваивать значения переменных, count1 присваивается 0, не count2 никакого присваивания , чтобы сохранить значение 1, результат: <br> count1 = 0; count2 = 1;

резюме

JVM является кодом компьютерного моделирования, с его собственными аппаратным и программным обеспечением, JVM позволяет классы Java для загрузки и запуска определенного процесса загрузки является: погрузка, проверка, подготовка, аналитической, инициализируют пять шагов.

рекомендация

отwww.cnblogs.com/gcghcxy/p/10974568.html