← Назад к вопросам
Где сохраняется объект?
1.0 Junior🔥 141 комментариев
#JVM и управление памятью#Основы Java
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Где сохраняется объект в Java?
Краткий ответ
Объекты в Java сохраняются в Heap (куче), а ссылки на них хранятся в Stack (стеке).
public void example() {
String str = new String("Hello"); // Объект в Heap
// Ссылка 'str' в Stack
}
Stack vs Heap
Stack (Стек)
Хранит локальные переменные и ссылки на объекты.
public void methodExample() {
int age = 25; // Stack: age = 25
String name = "John"; // Stack: ссылка name
Person person = new Person(); // Stack: ссылка person
}
// После выхода из метода все локальные переменные удаляются
Характеристики:
- LIFO структура
- Быстрый доступ
- Ограниченный размер
- Автоматическая очистка
- Потокобезопасный (свой для каждого потока)
Heap (Куча)
Хранит объекты и массивы.
public void heapExample() {
Person person = new Person(); // Объект в Heap
int[] numbers = {1, 2, 3}; // Массив в Heap
String text = "Hello"; // String объект в Heap
}
Характеристики:
- Неупорядоченная структура
- Медленнее, чем Stack
- Большой размер
- Управляется Garbage Collector
- Общий для всех потоков
Примеры
Примитивные типы vs объекты
int age = 25; // Stack: примитив
String name = "Alice"; // Stack: ссылка, Heap: объект
Integer count = 100; // Stack: ссылка, Heap: Integer
List<String> items = new ArrayList<>(); // Stack: ссылка, Heap: ArrayList
Массивы
int[] numbers = {1, 2, 3}; // Stack: ссылка, Heap: массив
String[] strings = {"a", "b"}; // Stack: ссылка, Heap: массив + String
Person[] people = new Person[2]; // Stack: ссылка, Heap: массив + Person
Жизненный цикл объекта
Person p = new Person("John"); // 1. Объект создан в Heap
// 2. Ссылка p в Stack
p.setAge(30); // 3. Объект модифицируется
Person p2 = p; // 4. p2 указывает на ТОТ ЖЕ объект
p = null; // 5. p больше не указывает
// p2 всё ещё указывает
// 6. Когда p2 выходит из области видимости
// Garbage Collector удалит объект из Heap
String Pool
Строки имеют специальное хранилище.
String s1 = "Hello"; // String Pool (Heap)
String s2 = "Hello"; // Та же ссылка
String s3 = new String("Hello"); // Новый объект
s1 == s2; // true (одна ссылка)
s1 == s3; // false (разные объекты)
s1.equals(s3); // true (одно содержимое)
Static переменные
Static переменные хранятся в Method Area (PermGen/Metaspace).
public class Counter {
static int count = 0; // Method Area
private int id; // Каждый объект имеет свой в Heap
Counter c1 = new Counter(); // c1 → Heap
Counter c2 = new Counter(); // c2 → Heap (другой объект)
}
Memory Layout
STACK HEAP
┌───────────────┐ ┌──────────────────────┐
│ x = 10 │ │ String "Hello" │
│ name → [ref] │──→ Person {age: 30} │
│ obj → [ref] │ │ ArrayList │
│ count = 42 │ │ [Garbage] │
└───────────────┘ └──────────────────────┘
Таблица: Stack vs Heap
| Параметр | Stack | Heap |
|---|---|---|
| Содержит | переменные, ссылки | объекты, массивы |
| Размер | ограничен | больше |
| Скорость | быстро | медленнее |
| Управление | автоматическое | GC |
| Потокобезопасность | да | нет |
| Жизненный цикл | по области видимости | по ссылкам |
Заключение
Объекты → Heap Ссылки → Stack Static переменные → Method Area