Память в Java Virtual Machine (JVM) разделена на несколько областей, каждая из которых выполняет свою роль в управлении данными и выполнении программы. Основные области памяти в JVM включают стек (stack), кучу (heap), и метод-арену (method area). Давайте разберем каждую из них подробно.
Стек — это область памяти, которая используется для хранения локальных переменных и вызовов методов. Каждый поток в Java имеет свой собственный стек, который создается одновременно с потоком. Стек работает по принципу LIFO (Last In, First Out), то есть последний добавленный элемент будет извлечен первым.
StackOverflowError
.Пример:
public class StackExample {
public static void main(String[] args) {
int x = 10; // Локальная переменная, хранится в стеке
int y = 20;
int result = add(x, y);
System.out.println("Result: " + result);
}
public static int add(int a, int b) {
int sum = a + b; // Локальные переменные a, b, sum хранятся в стеке
return sum;
}
}
В этом примере при вызове метода add
создается новый фрейм в стеке, где хранятся переменные a
, b
и sum
.
Куча — это область памяти, которая используется для хранения объектов и массивов. В отличие от стека, куча является общей для всех потоков и управляется сборщиком мусора (Garbage Collector, GC).
Пример:
public class HeapExample {
public static void main(String[] args) {
String name = new String("John"); // Объект String создается в куче
int[] numbers = new int[10]; // Массив создается в куче
}
}
В этом примере объект String
и массив numbers
хранятся в куче.
Метод-арена (также известная как область методов или Permanent Generation до Java 8) — это область памяти, которая используется для хранения метаданных классов, статических переменных, констант и информации о методах.
Пример:
public class MethodAreaExample {
public static final String CONSTANT = "Constant Value"; // Константа хранится в метод-арене
public static int staticVar = 10; // Статическая переменная хранится в метод-арене
public static void main(String[] args) {
System.out.println(CONSTANT);
System.out.println(staticVar);
}
}
В этом примере константа CONSTANT
и статическая переменная staticVar
хранятся в метод-арене.
Каждый поток имеет свой программный счетчик, который хранит адрес текущей выполняемой инструкции. Если метод не является нативным, PC Register содержит адрес инструкции в байт-коде.
Эта область используется для вызова нативных методов (методов, написанных на других языках, таких как C/C++). Каждый поток имеет свой собственный стек нативных методов.
Понимание устройства памяти в JVM помогает писать более эффективные и оптимизированные программы, а также избегать утечек памяти и других проблем, связанных с управлением памятью.