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

Хранятся ли в куче переменные, являющиеся свойствами объектов

2.0 Middle🔥 161 комментариев
#JVM и управление памятью#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Хранение переменных-свойств объектов в куче

Да, переменные, являющиеся свойствами объектов, хранятся в куче (heap) вместе с самим объектом.

Структура памяти объекта

Когда создаётся объект в Java:

public class Person {
    private String name;           // Ссылка на строку
    private int age;               // Примитивный тип
    private List<String> hobbies;  // Ссылка на список
}

Person person = new Person();
person.name = "John";
person.age = 30;
person.hobbies = new ArrayList<>();

Где хранится что

В куче (Heap) хранится:

  • Сам объект Person с его структурой
  • Значение примитива age (30) — содержится в объекте
  • Ссылка на String объект (person.name указывает на Heap)
  • Сам String объект "John" в памяти Heap
  • Ссылка на ArrayList (hobbies указывает на Heap)
  • Сам ArrayList объект в памяти Heap

В стеке (Stack) хранится:

  • Переменная-ссылка person, которая указывает на объект в Heap

Визуализация памяти

Stack                           Heap
┌─────────────┐               ┌──────────────────┐
│ person      │──────────────>│ Person object    │
│ (reference) │               ├──────────────────┤
└─────────────┘               │ name ────────────┼───────> "John"
                              │ age: 30          │
                              │ hobbies ─────────┼──────> ArrayList
                              └──────────────────┘        └──────┘

Подробная схема памяти

public class Employee {
    private String name;        // Поле 1
    private double salary;      // Поле 2 (примитив)
    private Address address;    // Поле 3 (ссылка на объект)
    private static int count;   // Статическое поле (находится в Method Area)
}

Employee emp = new Employee();

Результат в памяти:

  1. Stack: переменная emp — 8 байт (ссылка на объект)
  2. Heap: объект Employee содержит:
    • Object header (16 байт на 64-битной JVM)
    • name: ссылка на String объект в Heap
    • salary: 8 байт (double значение внутри объекта)
    • address: ссылка на Address объект в Heap
  3. Heap: String объект на который указывает name
  4. Heap: Address объект на который указывает address
  5. Method Area: статическое поле count

Ключевые моменты

1. Примитивные типы в составе объекта:

class Point {
    int x;      // Хранится В объекте на Heap, не отдельно
    int y;      // Хранится В объекте на Heap, не отдельно
}

Значения x и y находятся непосредственно внутри объекта Point в Heap.

2. Ссылочные типы в составе объекта:

class Department {
    String name;      // Ссылка на String в Heap
    Employee[] staff; // Ссылка на массив в Heap
}

Объекты, на которые указывают эти поля, тоже находятся в Heap.

3. Примитивные типы как локальные переменные:

public void example() {
    int localInt = 10;      // Хранится в Stack
    String localString = "test"; // Ссылка в Stack, объект в Heap
}

Жизненный цикл

// 1. Создание
Person p = new Person();  // Объект создан в Heap

// 2. Использование
p.name = "Alice";         // Все поля объекта в Heap
p.age = 25;

// 3. Удаление из области видимости
// p = null;              // Ссылка в Stack удаляется
// Объект в Heap становится недостижимым
// GC удалит объект из Heap

Вывод

Переменные-свойства объектов хранятся в куче как часть самого объекта. Примитивные поля хранят значения внутри объекта, а ссылочные поля хранят адреса других объектов в Heap. Это обеспечивает целостность и единство объекта в памяти.