| Главная » Статьи » 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 | |
| Просмотров: 359 | | |
| Всего комментариев: 0 | |