Главная » Статьи » Java » Java Ranger Basic

День 1/21
Stack, Heap, PermGen

Про Stack и про Heap явно говорят в спецификации виртуальной машины, про PermGen (Permanent Generation) в спецификафии VM не говорят так явно.
На каждый поток – Stack, в каждом стеке на каждый вызов – Frames.
Но в реальности это может выглядеть по-другому – у нас может быть 10 областей памяти или одна область памяти, мы в Java-программе никак не можем узнать, как устроена JVM.

Stack

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

Стек – это память, которая выделяется одному потоку выполнения. Один стек занимает от 256 Kb до 1 Mb – это по умолчанию, в реальности при запуске виртуальной машины можно указать stack size:
java.exe –Xss:100k App00.class
Этот параметр передастся нашей JVM, и она нам выделит в этом классе на один стек – 100 килобайт, тогда размер стека на один поток будет 100 Кб. В однопоточных программах стек – один.
Stack – это один сплошной кусок памяти (хотя в спецификации это не указано), в котором выделяются фреймы методов, MethodFrames – если у нас примитивный тип, и это локальная переменная, то она целиком хранится здесь. Но если у нас ссылочный тип, а это любой тип, кроме 8 примитивов, включая массивы, то там внутри ссылки как-то записан адрес объекта в памяти Heap.
Зачастую стек непрерывно растет в одну сторону.
Когда Java запускается, она выделяет около 1 Гб памяти. Большую часть этой памяти занимает Heap (или куча). Stack занимает чуть-чуть.

Heap

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

PermGen

PermGen или Permanent Generation (постоянное поколение) – область памяти, где хранятся загруженные классы. Можно сказать, что в PermGen’e хранятся байткоды методов, и хранятся статические поля.
O PermGen в спецификации указано очень смутно, он там каждый раз называется по-разному. Они говорят, что должна быть такая область, где будут хранится байт-коды методов, назовем это место памяти MethodArea. В следующий раз они говорят про Run-Time Constant Pool – говорят, что не знают, где авторы JVM это сделают, но где-то должны лежать константы. Но конкретно в виртуальной машине HotSpot это место называется PermGen. Причем в Java 7 оно называлось PermGen и хранилось внутри Heap, а уже в Java 8 оно называется Metaspace и хранится снаружи Heap.



В следующей теме мы рассмотрим: Sorting Algorithms

Источник: http://becomejavasenior.com/courses/?utm_source=Java+Email+Courses&utm_campaign=aa710df388-JavaRangerBasicIntro&utm_medi
Категория: Java Ranger Basic | (06.10.2015) W
Просмотров: 359 | Теги: Basic, ranger, java | Рейтинг: 0.0/0
Всего комментариев: 0
avatar