- В чем отличия между пространствами памяти Java (Perm Space, Space Stack, Heap Space)?
- Когда используется JVM тот или иной?
- Если я использую Scala/Groovy/etc., существуют ли отличия?
Куча против стека против Пермского пространства
Ответ 1
Просто
- Пустое место: все живые объекты выделяются здесь.
- Stack space: хранит ссылки на объект для переменной в вызове метода или создании экземпляра переменной.
- Пермское пространство: хранит информацию о загруженных классах.
Например:
Student std = new Student();
после выполнения строки над статусом памяти будет выглядеть следующим образом.
- Куча: сохраняет "новый ученик()"
- Стек: хранит информацию о "std"
- Perm Space: хранит информацию о классе Student
Ответ 2
Простите меня за добавление ответа на такой старый вопрос. Текущий ответ замечательный, но пропустил несколько случаев краев из-за статического кода и обновлений Java 8.
Обзор
- Стек
- Выделено для потока
- Сохраняет локальные ссылки и примитивы.
- Это область памяти. Когда метод или поток заканчиваются, все их данные в стеке теряются.
- Имеет самый быстрый доступ, поэтому локальный примитив работает быстрее, чем локальный объект
- Heap
- Здесь присутствуют все экземпляры выделенных объектов.
- Разделенные на поколения, причем младшее поколение является первым местом GC выглядит
- Доступно для всех потоков, поэтому необходимо синхронизировать распределения и освобождения от рассылки
- Эта память может стать фрагментированной (но вы обычно не управляете этим сами)
- PermGen
- Сохраняет загруженную информацию о классе
- Сохраняет неизменяемую информацию (Primatives, interned Strings)
- Сохраняет статический класс участников
Пример кода
public class SimpleVal { //The Class (loaded by a classloader) is in the PermGen
private static final int MAGIC_CONSTANT = 42; //Static fields are stored in PermGen
private static final SimpleVal INSTANCE = new SimpleVal(1); //Static field objects are created in the heap normally, with the reference in the PermGen ('class statics' moved to the heap from Java 7+)
private static SimpleVal previousInstance; //Mutable static fields also have their reference in PermGen so they can easily cause memory leaks
private int value; //Member variables will be part of the heap
public SimpleVal(int realValue) {
value = realValue;
...
}
public static int subtract(SimpleVal val1, SimpleVal val2) {
....
}
public int add(SimpleVal other) { //Only one copy of any method (static or not) exists - in PermGen
int sum = value + other.value; //Local values in methods are placed in the Stack memory
return sum;
}
}
public static void main(String[] args) {
SimpleVal val1 = null;
SimpleVal val2 = new SimpleVal(3); //Both of these variables (references) are stored in the Stack
val1 = new SimpleVal(14); //The actual objects we create and add to the variables are placed in the Heap (app global memory, initially in the Young Gen space and later moved to old generation, unless they are very large they can immediately go old gen)
int prim = val1.add(val2); //primitive value is stored directly in the Stack memory
Integer boxed = new Integer(prim); //but the boxed object will be in the heap (with a reference (variable) in the Stack)
String message = "The output is: "; //In Java 7+ the string is created in the heap, in 6 and below it is created in the PermGen
System.out.println(message + prim);
}
Java 8 Примечание: Место PermGen было заменено на то, что называется Metaspace. Это по-прежнему действует одинаково, но может быть изменено автоматически. По умолчанию Metaspace auto увеличивает свой размер в собственной памяти до максимума (указанный в параметрах JVM), но PermGen всегда имеет фиксированный максимальный размер, смежный с памятью кучи.
Android Примечание: От Android 4.0 (от 3.0 на практике) Android должен соблюдать описанные контракты памяти, но в старых версиях была нарушена реализация . Память "Stack" в Android-Davlik фактически зарегистрирована на регистре (размеры и количество команд различаются между ними, но для разработчика функциональность остается той же).
Наконец, для получения дополнительной информации лучший ответ, который я когда-либо видел в этой теме в StackOverflow, здесь