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

Давайте кратко рассмотрим каждый из этих компонентов в соответствии с тем, что указано в спецификациях JVM.
1.1. Куча памяти
Область кучи представляет собой область данных времени выполнения, из которой выделяется память для всех экземпляров классов и массивов, и создается во время запуска виртуальной машины.
Хранилище кучи для объектов освобождается автоматической системой управления хранилищем. Куча может иметь фиксированный или динамический размер(в зависимости от конфигурации системы), а память, выделенная для области кучи, не обязательно должна быть непрерывной.
Реализация виртуальной машины Java может предоставить программисту или пользователю контроль над начальным размером кучи, а также, если куча может динамически расширяться или сжиматься, контроль над максимальным и минимальным размером кучи.
Если для вычисления требуется больше кучи, чем может предоставить автоматическая система управления хранилищем, JVM выдает исключение OutOfMemoryError.
1.2 Область методов и пул констант времени выполнения
Область методов хранит структуры для каждого класса, такие как пул констант времени выполнения, данные полей и методов, код методов и конструкторов, включая специальные методы, используемые при инициализации класса, экземпляра и интерфейса.
Область методов создается при запуске виртуальной машины. Хотя она логически является частью кучи, она может или не может быть собрана мусором, тогда как мы уже читали, что сбор мусора в куче не является необязательным; он обязателен. Область методов может иметь фиксированный размер или может быть расширена по мере необходимости для вычислений и может быть использована, если большая область методов становится ненужной. Память для области методов не обязательно должна быть непрерывной.
Если память в области методов не может быть доступна для удовлетворения запроса на выделение памяти, виртуальная машина Java выдает исключение OutOfMemoryError.
1.3.Стеки
Каждый из потоков JVM имеет частный стек, созданный в то же время, что и поток. Стек хранит кадры. Кадр используется для хранения данных и частичных результатов, а также для выполнения динамического связывания, возврата значений для методов и отправки исключений.
Он содержит локальные переменные и частичные результаты и играет роль в вызове и возврате метода. Поскольку этот стек никогда не обрабатывается напрямую, за исключением отправки и извлечения кадров, кадры могут быть выделены в куче. Подобно куче, память для этого стека не обязательно должна быть непрерывной.
Эта спецификация допускает, что стеки могут быть фиксированного или динамического размера. Если это фиксированный размер, размер каждого стека может быть выбран независимо при создании этого стека.
Если вычисления в потоке требуют большего объема стековой памяти, чем разрешено, JVM выдает исключение StackOverflowError.
Если стеки могут быть динамически расширены и предпринимается попытка расширения, но для осуществления расширения недостаточно памяти или недостаточно памяти для создания начального стека виртуальной машины Java для нового потока, виртуальная машина Java выдает исключение OutOfMemoryError.
1.4.Стеки собственных методов
Стеки собственных методов называются стеками C; они поддерживают собственные методы(методы написаны на языке, отличном от языка программирования Java), обычно выделяемые для каждого потока при создании каждого потока. Реализации виртуальной машины Java, которые не могут загружать собственные методы и которые сами не полагаются на обычные стеки, не должны предоставлять собственные стеки методов.
Размер стеков собственных методов может быть как фиксированным, так и динамическим.
Если для вычисления в потоке требуется больший стек собственных методов, чем разрешено, виртуальная машина Java выдает исключение StackOverflowError.
Если стеки собственных методов могут быть динамически расширены и предпринимается попытка расширения стека собственных методов, но при этом может быть выделено недостаточно памяти или если для создания начального стека собственных методов для нового потока может быть выделено недостаточно памяти, виртуальная машина Java выдает исключение OutOfMemoryError.
1.5 Регистры ПК
Каждый из потоков JVM имеет свой собственный регистр счетчика программ(pc). В любой момент каждый из потоков JVM выполняет код одного метода, а именно текущего метода для этого исполняющегося потока.
Поскольку приложения Java могут содержать некоторый собственный код(например, с использованием собственных библиотек), у нас есть два разных способа для собственных и не собственных методов. Если метод не является собственным(то есть кодом Java), регистр PC содержит адрес инструкции JVM, которая в данный момент выполняется. Если метод является собственным, значение регистра PC JVM не определено.
Регистр ПК виртуальной машины Java достаточно широк, чтобы хранить адрес возврата или собственный указатель на конкретной платформе.
2. Заключение
Мы узнали о модели памяти Java и ее области памяти и структурировании внутри JVM. Мы придумаем идеи, как использовать эту информацию для настройки производительности в следующих постах.
Ссылка: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html