Heap — это области памяти, выделенные для каждой программы. Память, выделенная для кучи, может быть выделена динамически, в отличие от памяти, выделенной для стека.
В результате сегмент кучи может быть запрошен и освобожден всякий раз, когда это необходимо программе. Эта память также является глобальной, что означает, что доступ к ней и ее изменение можно получить из любого места в программе, где она выделена, вместо локализации функцией, в которой она выделена. На динамически выделенную память ссылаются с помощью «указателей», что, в свою очередь, приводит к небольшому снижению производительности по сравнению с использованием локальных переменных (в стеке).
Heap памяти также известна как «динамическая» память.
Память кучи отличается от памяти локального стека. Он отличается не только тем, как он выделяет и освобождает переменные при вызове функции, но и тем, как он освобождает переменную при выходе из функции. Этот «блок» памяти обычно определяется автоматически в зависимости от размера создаваемого ими объекта.
Преимущества динамической памяти:
- Куча не имеет ограничений на размер памяти.
- Это позволяет вам обращаться к переменным глобально.
- Сборка мусора выполняется в памяти кучи, чтобы освободить память, используемую объектом.
- Метод кучи также используется в очереди приоритетов.
Недостатки динамической памяти:
- Выполнение занимает слишком много времени по сравнению со стеком.
- Для вычисления требуется больше времени.
- Он может предоставить максимальную память, которую может предоставить ОС.
- Управление памятью в куче сложнее, так как она используется глобально.
Проблемы, которые можно решить с помощью динамической памяти:
Ниже приведены некоторые важные моменты, касающиеся сборки мусора.
- Виртуальная машина Java вызывает сборку мусора, чтобы избавиться от неиспользуемых объектов памяти кучи. Он удаляет все объекты, которые больше не используются работающей программой Java. В этом процессе неиспользуемая память освобождается для использования другими новыми объектами.
- Сборка мусора вызывает метод finalize()объекта, прежде чем удалить его из памяти и дать ему возможность очиститься. Если программист не переопределит этот метод, будет вызван метод finalize по умолчанию (метод, определенный в классе Object).
- Сборка мусора вызывается на основе размера динамически выделенной памяти из кучи. Это медленно и трудно предсказать. Программам с ограничениями производительности в реальном времени может быть трудно справиться с этим.
Пример создания memory in heap:
С++
int
Geeks()
{
// Nothing allocated yet excluding the
// pointer itself, which is allocated
// here on the stack.
char
* p;
// Memory allocated on the stack.
bool
flag =
true
;
if
(flag) {
// Create 1000 bytes on the stack
char
buffer[1000];
// Create 1000 bytes on the heap
p =
new
char
[1000];
}
// buffer is deallocated here but pointer
// p is not Here occurs a memory leak,
// We have to call delete[] p;
}
Points to Remember:
1 | Он хранится в оперативной памяти компьютера так же, как стек. |
2 | Он имеет более медленное распределение переменных по сравнению с переменными в стеке. |
3 | Он работает на основе использования по запросу выделения блока данных для использования программой. |
4 | Он может иметь фрагментацию, когда есть много выделений и освобождений. |
5 | В C++ переменные в куче должны быть уничтожены вручную и никогда не выпадать из области видимости. Данные освобождаются с помощью delete, delete[] или free. |
6 | В C++ или C данные, созданные в куче, будут указываться указателями и размещаться с помощью new или malloc соответственно. |
7 | Мы можем использовать динамическую память, если вы точно не знаете фактический размер данных, необходимых во время выполнения, или если вам нужно выделить много данных. |
8 | Он отвечает за утечки памяти. |