Это артефакт базовой вычислительной модели. Память для операционной системы выглядит как большое, в основном непрерывное пространство, в котором данные могут быть прочитаны и записаны по адресу. Операционная система позволяет процессам захватывать блок памяти (большое непрерывное пространство, обычно не менее одной страницы из пары К) и делать это по своему усмотрению, используя адреса памяти и операции чтения / записи.
На этом основывается Java-куча, то есть для программиста это выглядит просто как большой мешок памяти (это, конечно, нет, т.е. сборка мусора обычно перемещает вещи), на которые он получает «адреса» (ссылки действительно, они фактически не являются адресами) для данных (объектов), записанных в это пространство памяти. Это дает вам максимальную гибкость для построения более специализированных структур данных поверх этого.
Помните, что он действует как "куча" для программиста, потому что это дает вам необходимую гибкость, но его не нужно реализовывать как таковое. Это часть памяти, управляемая сборщиком мусора, и есть куча структур данных, которые он использует для своей работы, которые вы можете или не могли бы рассматривать как часть кучи, т.е. это память, используемая и выделяемая JVM, но обычно в этом контексте «куча» считается только памятью, доступной программисту.