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

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

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

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

Стек

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

Куча

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

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

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

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

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

Собственные стеки методов

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

Вывоз мусора

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

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

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