Похоже, вы читали учебник или что-то подобное. Все эти термины, как правило, имеют очень точные определения в книгах / лекциях, но гораздо менее точные определения в реальности. Поэтому то, что люди имеют в виду, когда говорят «куча», не обязательно совпадает с тем, что говорится в книге и др. говорит.
Память разделена на «сегменты», называемые кучей, стеком, bss, данными и текстом.
Это верно только для типичного процесса в пространстве пользователя. Другими словами, это будет верно для повседневной программы, написанной в c или аналогичной, однако это не так для всех программ и определенно не верно для всего пространства памяти.
Когда программа выполняется ОС выделяет память для различных перечисленных сегментов, кроме кучи. Программа может запрашивать память у ОС во время ее выполнения. Это позволяет программе использовать различное количество памяти в зависимости от ее потребностей. Куча относится к памяти, запрошенной программой, обычно с помощью функции, подобной mallo c. Для уточнения кучи обычно ссылаются на управляемую область памяти, обычно управляемую с помощью malloc / free. Также возможно запрашивать память непосредственно из ОС, неуправляемым способом. Большинство людей (Imo) сказали бы, что это не будет считаться частью кучи.
Стек - это структура данных / сегмент, которая отслеживает локальные переменные и вызовы функций. Он хранит важную информацию, например, куда вернуться после вызова функции. В c или других «родных» языках стек создается ОС и может при необходимости увеличиваться или уменьшаться.
Java позволяет программе запрашивать память во время выполнения, используя new. Память, выделенная для java программы с использованием new, называется памятью в куче java. Можно представить, что если вы внедряете Jvm, вы будете использовать mallo c за кулисами нового. Это приведет к куче java в обычной куче. На самом деле «серьезные» jvms не делают этого и напрямую взаимодействуют с ОС для памяти.
В Java стек создается Jvm. Можно предположить, что это выделяется mallo c, но, как и в случае с кучей, скорее всего, это не так, как это делают jvms в реальном мире.
Редактировать: Jvm-подобная точка доступа. Скорее всего выделит память напрямую из ОС. Затем эта память будет помещена в некоторый пул, из которого она будет удалена по мере необходимости. Причины, по которым потребуется необходимая память, включают новые или стек, который должен расти.