← Назад к вопросам

Где сохраняется объект?

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

ПараметрStackHeap
Содержитпеременные, ссылкиобъекты, массивы
Размерограниченбольше
Скоростьбыстромедленнее
УправлениеавтоматическоеGC
Потокобезопасностьданет
Жизненный циклпо области видимостипо ссылкам

Заключение

Объекты → Heap Ссылки → Stack Static переменные → Method Area