1. Структура JVM
Рис.1. Структура виртуальной машины Java.
Внутренняя структура JVM приведена на рис. 1. Подсистема загрузки классов
занимается поиском файлов необходимых классов и непосредственно выполняет их
загрузку. Во время своей работы виртуальная машина использует следующие области
данных: область методов, кучу, Java-стеки, pc-регистры и стеки native-методов.
Некоторые из этих областей данных создаются во время запуска виртуальной машины
и уничтожаются только когда JVM завершает свою работу. Другие области данных
создаются для каждого потока и уничтожаются при завершении потока. Механизм
выполнения включает в себя интерпретатор байт-кода и обеспечивает выполнение
Java-программы. Для обращения к средствам операционной системы JVM имеет
интерфейс и библиотеки native-методов.
1.1. Область методов
Область методов является общей областью данных для всех потоков виртуальной
машины Java. Область методов является аналогом области хранения
скомпилированного кода для традиционных языков программирования или сегмента
кода UNIX-процесса. Область методов хранит структуры для каждого класса, такие
как набор констант, данные о полях и методах, а также код методов и
конструкторов, включая специальные методы, используемые для инициализации
классов, объектов и интерфейсов.
Область методов создаётся при запуске виртуальной машины. Область методов
может быть фиксированного размера, динамически расширяемой и динамически
сжимаемой. Последовательное выделение памяти для области методов не обязательно.
Если попытка выделения памяти в области методов завершается неудачей, то JVM
генерирует исключение OutOfMemoryError.
Рис.2. Область методов и куча.
1.2. Куча
Куча виртуальной машины Java является общей для всех потоков вычислений.
Куча является областью данных времени выполнения, из которой выделяется память
для всех экземпляров классов и массивов.
Куча создаётся при запуске виртуальной машины. Место для объектов в куче
восстанавливается автоматической системой управления памятью (известной как
сборщик мусора). Память, занятая объектами, никогда не освобождается явно.
Алгоритм сборщика мусора может быть произвольно выбран разработчиком конкретной
реализации JVM. Куча может быть фиксированного размера, или динамически
расширяться в процессе работы, причём возможнен также и обратный процесс - то
есть сокращение кучи, если её часть оказывается ненужной. Память для кучи может
быть выделена непоследовательно.
С кучей связана следующая исключительная ситуация: если вычислительный
процесс требует больше памяти, чем может быть предоставлено, то JVM генерирует
исключение OutOfMemoryError.
1.3. pc-регистры
Виртуальная машина Java может поддерживаь работу нескольких потоков
исполнения одновременно. Каждый поток JVM имеет свой собственный pc (program
counter) регистр. В любой момент времени каждый поток JVM исполняет код
единственного метода, текущего метода для данного потока. Если этот метод не
является native-методом, pc-регистр содержит адрес команды
виртуальной машины Java, которая выполняется в данный момент. Если метод,
выполняемый в текущий момент потоком, является native-методом, то
значение pc-регистра JVM не определено. Регистр pc должен быть
достаточного размера, чтобы содержать величины типа returnAddress или
native-указатель определённой платформы, на которой реализована JVM.
1.4. Java-стеки
Каждый поток виртуальной машины Java имеет свой собственный Java-стек,
создаваемый одновременно с потоком. Java-стек состоит из
фреймов. Java-стек является аналогом стека традиционных
языков, таких как например Си: он содержит локальные переменные и промежуточные
результаты, а также играет роль в вызове методов и возврате из них. Так как с
Java-стеком никогда не работают напрямую, за исключением операций помещения
фреймов в стек и выталкивания из стека, фреймы могут быть выделены в куче.
Память для Java-стека не обязательно должна выделяться последовательно.
В соответствии со спецификацией JVM, Java-стеки могут быть фиксированного
размера либо динамически расширяемыми. В первом случае, при создании потока
сразу выделяется область памяти фиксированного размера под стек. Во втором
случае выделяется некоторый начальный размер памяти под Java-стек, а
впоследствии в зависимости от потребностей вычислительного процесса может быть
выделена дополнительная память.
С Java-стеками ассоциируются следующие две исключенительные ситуации:
- Если вычислительный процесс требует большее количество памяти, чем это
разрешено, JVM генерирует исключение StackOverflowError.
- Если Java-стек динамически расширяемый и попытка выделения
дополнительной памяти закончилась неудачей, или невозможно выделить
память для начального Java-стека, то в этом случае JVM генерирует
исключение OutOfMemoryError.
Рис.3. Java-стеки, pc-регистры и стеки native-методов.
1.5. Стеки native-методов
Реализация виртуальной машины Java может использовать традиционные стеки для
поддержки native-методов, то есть методов, написанных на языках, отличных от
Java. Стеки native-методов могут также использоваться интерпретатором системы
команд JVM при реализации на таком языке, как Си. Стек native-методов обычно
создаётся для каждого потока при его инициализации.
Допускаются стеки как фиксированного размера, так и динамически
расширяемые/сжимаемые.
Исключительные ситуации, связанные со стеком native-методов, аналогичны
исключениям Java-стека.
Наверх | Дальше
|