JVM отмечает исследование - класс механизм загрузки

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

1, Жизненный цикл

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

2, процедура загрузки классов

2.1 Нагрузка

   Внешняя виртуальная машина в соответствии с двоичным потоком байтов, необходимых для хранения виртуальной машины в процессе формата зоны, формат хранения Процесс зоны, определенной самой виртуальной машине, и объект класса экземпляра в памяти (объекты класса виртуальной машины HotSpot не расположены в но в способе кучного области). На этапе загрузки, виртуальная машина должна сделать три вещи:

1, чтобы получить такой двоичный поток байтов определяется полным именем класса

2, эти статические структуры хранения представлены потоком байт в время выполнения метода структуры данных зоны

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

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

1, типа компоненты (массив удалить тип измерения), если массив является типом ссылки, то необходимо, чтобы получить полное имя класса компонента, чтобы получить объект класса, массив будет загружен на имя класса пространстве загрузчика классов типа компонента Он идентифицируется (двумерный массив?).

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

3, тип видимости данных и ее компоненты в соответствии с типом видимости (то же самое?), Если тип компонента не является ссылочным типом, видимость класса массива по умолчанию для общественности.

2.2 проверка

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

1, проверка формата файла:

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

2, тест метаданные:

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

3, байт-код проверки:

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

4, опорный символ проверки:

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

2.3 Подготовка

  Выделение памяти для фазы подготовки устанавливается переменным класс и начальное значение фазы, в области памяти, используемой в способе распределения (переменный экземпляр, когда объект создается экземпляр в качестве объекта, выделенного в куче). Если переменная класс является постоянной, то есть, с модифицированным конечным переменными статическим классом и, на этапе подготовки будет инициализирован к постоянному значению, например, следующее значение в фазе подготовки 123 быть назначено.

публичное  статическое  окончательный  INT значение = 123;

Другие переменные класса инициализируются нулевым значением. Следующее значение переменной равно 0 после того, как на этапе подготовки, будет находиться в начальной стадии из конструктора класса <clinit> () 123, который назначен.

общественное  статическое  INT значение = 123;

  Различные типы нулевого значения:

Типы данных Нулевое значение Типы данных Нулевое значение
голец '\ U0000' поплавок 0.0f
байт (Байт) 0 двойной 0.0d
короткая (Короткий) 0 логический ложный
ИНТ 0 ссылка ноль
долго 0L    

2.4 разобран

  Синтаксический этап представляет собой виртуальную машину до символического постоянного пула ведения процесса замены прямых ссылок. Есть семь видов опорных символов, класса или интерфейса, полей, класс методов, метод интерфейса, метод типа, метод обработчика, извещатели Квалификатор, соответствующий файл класса постоянный пул CONSTANT_Class_info, CONSTANT_Fieldref_info, CONSTANT_Methodref_info, CONSTANT_InterfaceMethodref_info, CONSTANT_MethodType_info, CONSTANT_MethodHandler, CONSTANT_InvokeDynamic_info7 постоянный тип. Некоторое прямое указание используется для определения местоположения в исходном положении (положение объектов памяти) в памяти, может быть непосредственно указатель назначения или распределение памяти относительного позиционирования смещения косвенно ручка, а реализация виртуальной машины связанные. Виртуальная машина спецификация не определяет, каким образом происходит фаза с временным разрешением, он может быть решен в соответствии с потребностями, которые будут загружены, когда загрузчик классов, или пока опорный символ должен использоваться только для разрешения ранее.

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

2.4.1 Аналитический класс или интерфейс

  Предположим, что текущий код, в котором класс D, если мы хотим не разобраны и не разрешать символические ссылки на N прямой ссылки класса или интерфейса C, необходимо выполнить следующие действия:

1, если С не является типом массива, виртуальный полное название N передается D загрузчик классов загрузить класс, в процессе загрузки, так как проверки метаданных, проверки байт-кода, другие классы могут вызвать загрузку действия, такие, как его родитель или загрузка реализации.

2, если С является тип массива, и тип элемента представляет собой массив объектов, в соответствии с типом элементов массива, загруженного правила 1, а затем генерирует массив объектов виртуальной машиной и размеры этого массива элементов представителя.

3, после завершения стадии C выше, виртуальная машина фактически стала действительным классом или интерфейсом, то проверка символических ссылок, D проверить, имеют ли они доступ к C.

2.4.2 поля разбор

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

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

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

3. В противном случае, если C не является java.lang.Object, в соответствии с наследованием от родительского поиска класса вверх.

4, в противном случае, поиск неудачен.

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

2.4.3 класс аналитический метод

  Аналитические методы метод класса класса нужно разрешить символические ссылки, относящиеся к классу или интерфейсу, то предполагается, что класс или интерфейс представлен C, метод поиска для разрешения класса преуспевает:

1, если С представляет собой интерфейс, возникает исключение.

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

3, в противном случае, родительский класс обед класс C рекурсивный поиск.

4. В противном случае, рекурсивный поиск в списке интерфейсов и реализации класса С их родительского интерфейса, если поиск успешен, указывая, что класс C является абстрактным классом, генерируется исключение java.lang.AbstractMethodError.

5. В противном случае, поиск неудачен.

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

2.4.4 разрешение метода интерфейса

  Для того, чтобы проанализировать класс или метод интерфейса опорного символа принадлежит, если успешно решено, то предполагается, что класс или интерфейс представлен C, метод поиска интерфейса:

1, если С представляет собой класс, а не интерфейс, исключение.

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

3, в противном случае, смотрите в рекурсивном интерфейсе родительского интерфейса.

4, в противном случае, поиск неудачен.

  Все методы интерфейса являются открытыми, нет никаких проблем доступа.

2.5 Инициализация

  В передней части нагрузки класса, в дополнении к участию заказа погрузчика, его работа полностью доминируют приложения виртуальных машин и управление загрузкой этапа. На самом деле начал выполнять классы Java кода, определенных на этапе инициализации. Виртуальная машина Спецификация строгие правила и только пять случаев класса должны быть инициализированы (загрузка, проверка, подготовка, естественно, раньше).

1, сталкиваются с новым, getstatic, putstatic invokestatic или 4, когда эта команда байткода, если класс не был инициализирован, инициализация должна быть запущена. Генерирование четыре инструкции общего сценария является: использование нового ключевого слова, чтобы создать экземпляр объекта, класс чтения или набор статических полей (то есть, для окончательного модифицированного компилятора в постоянный пул результата, за исключением), класса статического вызова метода.

Когда 2, java.lang.refect пакета, используя метод, основанный на отражающий вызов, если класс не был инициализирован, необходимо инициализировать флип-флоп.

3, при инициализации класса, если родительский класс не был найден инициализации, необходимо для запуска инициализации родительского класса.

4, при запуске виртуальной машины, пользователи должны указать главный класс, который будет выполнен (содержит метод Main () этого класса), виртуальную машину, чтобы инициализировать этот мастер-класс.

5, при использовании динамической поддержки языка jdk1.7, если конечный результат анализа на REF_getStatic java.lang.invoke.MethodHandle примера, REF_putStatic, метод обработку REF_invokeStatic, этот метод дескриптор класса, соответствующий не был инициализирован, необходимо запускает его инициализации.

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

общественный  класс SuperClass { 

    общественное  статическое  INT значение = 12 ; 

    статический { 
        System.out.println ( "SuperClass инициализация" ); 
    } 

} 

Общественного  класса SubClass расширяет SuperClass { 

    статический { 
        System.out.println ( "SubClass INIT" ); 
    } 

} 

Общественного  класс Тест1 { 

    общественный  статический  недействительный основной (String [] арг) { 
        System.out.println (SubClass.value); 
    } 

}

  Этот код будет выводить только «SuperClass INIT» и не потерять «SubClass INIT».

  Следующий код не выводится «SuperClass INIT» после операции, которая не вызвать инициализации описаны, но вызывает дополнительный код, называемые «[Lcom.yue.main.SuperClass» (com.yue.main пакет SuperClass имя инициализации) класса. Генерируется автоматически с помощью виртуальной машины, прямого наследниках java.lang.Object, для кода пользователя не имя класса, этот класс представляет тип элемента представляет собой одномерный массив com.yue.main.SuperClass.

общественный  класс TEST1 { 

    общественный  статический  недействительный основной (String [] агдз) { 
        суперкласс [] обры = новый SuperClass [2 ]; 
    } 

}

  фазы инициализации выполняются во время конструктора класса метода <clinit> (). Обратите внимание на следующие аспекты:

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

общественный  класс Test1 { 

    статического { 
        I = 0; // нормального сборник 
        System.out.println (I); // компиляция терпит неудачу 
    } 

    статические  INT I = 1. ; 

}

2, способ, кроме <clinit> () и экземпляр класса конструктор метод <INIT> (), никакого явного не вызвать конструктор родительского класса.

3, метод родительского класса <clinit> () выполняется первым, класс <clinit> первым выполняется () метод должен быть java.lang.Object, и, следовательно, статический блок операторов в переменном родительском классе приоритет подклассе назначение.

4 Метод, <clinit> () для класса или интерфейса не является необходимым, если класс не является статическим блок операторов присваивания, ни переменной класса, компилятор не может быть сгенерирован для метода <clinit> () класса.

5, интерфейс не может использовать статический оператор блока, но также генерирует метод <clinit> (). Реализует интерфейс <clinit> () метод не нужно запускать родительский интерфейс метод <clinit> (), инициализация интерфейса класс реализации не будет выполняться, когда метод <clinit> () интерфейс, родительский только переменная, определенная в интерфейсе При использовании, родительский интерфейс будет инициализировать (интерфейс не только постоянные вы?).

6, виртуальная гарантия класса метод <clinit> () надлежащим образом заперты в многопоточной среде, синхронизацию. Таким образом, только один поток для выполнения этого типа метода <clinit> (), другие потоки будут заблокированы.

3, класс погрузчик

  фаза загрузки Класса «чтобы получить описание такого потока двоичного байта через полное имя класса» действия достигается за пределами виртуальной машины Java, чтобы достичь этого код операции модуля, называемого «загрузчиком классов.»

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

3,1 класс Тип погрузчика

  С точки зрения виртуальной машины Java, загрузчик классов класс можно разделить на два вида загрузчика (Bootstrap ClassLoader) и другого загрузчика классов, загрузочный загрузчик классов является частью самой виртуальной машины, в то время как другой загрузчик классов осуществляется на языке Java, все происходит от абстрактного класса java.lang.ClassLoader. С точки зрения разработчика, система обеспечивает загрузчик класса можно разделить на три вида:

Загрузчик классов 1. Начало:

  Загрузчик классов отвечает в <JAVA_HOME> \ Lib каталога и виртуальная машина распознается (идентифицированный только как имя файла, например, rt.jar) библиотека загружается в память виртуальной машины. Начать загрузчик классов не может быть непосредственно ссылаются программы Java.

2, класс расширения погрузчик:

  Этот загрузчик классов отвечает за загрузку <JAVA_HOME> \ Lib \ каталог внутр, или всеми библиотеками, разработчики java.ext.dirs системные переменные определены пути могут быть использованы непосредственно расширить загрузчик классов.

Загрузчик классов 3, применение:

  Загрузчик классов является возвращаемым значением методы getSystemClassLoader ClassLoader (), он также упоминаются как система класса погрузчик. Он отвечает за загрузку указанного пути к классам библиотеки, программа по умолчанию класс Загрузчик.

модель делегирования 3,2 Родителя

  В дополнение к модели родительского делегирования требует верхнего уровня класса загрузчика, остальная часть загрузчика класса должен иметь свой собственный загрузчик родительского класса. Этот родитель-потомок между загрузчиком класса не будет реализован в наследстве, но код загрузчика сочетания отношений мультиплексировано с родителем. модель Родитель делегации, как показано ниже:

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

  使用双亲委派模型的其中一个好处是Java类随类加载器一起具备了一种带有优先级的层次关系。比如java.lang.Object类由启动类加载器加载,因此其他所有的类使用的都会是同一个Object类。

3.3 破坏双亲委派模型

  双亲委派模型并不是强制性的约束模型,有几种大规模的非双亲委派模型情况:

1、双亲委派模型很好的解决了各个类加载器的基础类统一问题,但如果基础类又要调用回用户的代码,Java设计团队引入了线程上下文类加载器。这个类加载器可以通过java.lang.Thread类的setContextClassLoaser()方法进行设置,如果创建线程时还未设置,它将会从父线程中继承一个,如果在应用程序的全局范围内都没有设置过,那这个类加载器默认就是应用程序类加载器。

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

отwww.cnblogs.com/liuwy/p/11093923.html