← Назад к вопросам
Хранятся ли в куче переменные, являющиеся свойствами объектов
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();
Результат в памяти:
- Stack: переменная emp — 8 байт (ссылка на объект)
- Heap: объект Employee содержит:
- Object header (16 байт на 64-битной JVM)
- name: ссылка на String объект в Heap
- salary: 8 байт (double значение внутри объекта)
- address: ссылка на Address объект в Heap
- Heap: String объект на который указывает name
- Heap: Address объект на который указывает address
- 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. Это обеспечивает целостность и единство объекта в памяти.