Учебники

Виртуальная машина Java — области данных времени выполнения

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

ПК (счетчик программ) Регистрация

Он является локальным для каждого потока и содержит адрес инструкции JVM, которую поток выполняет в данный момент.

стек

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

отвал

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

Область метода

Эта область выполнения является общей для всех потоков и создается при запуске JVM. Он хранит структуры для каждого класса, такие как пул констант (подробнее об этом позже), код для конструкторов и методов, данные методов и т. Д. JLS не определяет, нужно ли собирать эту область, и, следовательно, реализации JVM может игнорировать GC. Кроме того, это может или не может расширяться в соответствии с потребностями приложения. JLS не требует ничего в отношении этого.

Постоянный пул времени выполнения

JVM поддерживает структуру данных для каждого класса / типа, которая действует как таблица символов (одна из ее многочисленных ролей) при связывании загруженных классов.

Стеки родного метода

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

Вывоз мусора

JVM управляет всем жизненным циклом объектов в Java. Как только объект создан, разработчику больше не нужно беспокоиться об этом. В случае, если объект становится мертвым (то есть, на него больше нет ссылок), он извлекается из кучи GC, используя один из многих алгоритмов — последовательный GC, CMS, G1 и т. Д.

Во время процесса GC объекты перемещаются в память. Следовательно, эти объекты не могут быть использованы во время процесса. Все приложение должно быть остановлено на время процесса. Такие паузы называются паузами «останови мир» и являются огромными накладными расходами. Алгоритмы GC направлены в первую очередь на сокращение этого времени. Мы обсудим это очень подробно в следующих главах.

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