Стек(stack) это область памяти, используется для хранения локальных переменных и вызовов методов. Хранит ссылки на объекты в куче, а также типы значений (примитивных типов), которые содержат само значение, а не ссылку на объект. Работает по принципу LIFO (последним вошел, первым вышел). Быстрый доступ к данным. Потокобезопасен, так как каждый поток имеет свой собственный стек. Переменные в стеке имеют определенную видимость, известную как область видимости. Доступ к объектам из стека возможен только в пределах активной области видимости. Память освобождается автоматически при завершении метода.
Куча(heap) в Java — это область памяти, используемая для динамического выделения памяти под объекты и классы во время выполнения программы. Когда создается новый объект, память для него выделяется в куче. Куча служит для хранения фактических объектов, на которые указывают ссылки из стека. Служит для объектов и данных, созданных с помощью оператора new. JVM разделяет память на две области: кучу (heap), где хранятся данные приложения, и не-кучу (non-heap), где хранятся код программы и другие вспомогательные данные. Доступ к данным медленнее, чем в стеке. Объекты в куче могут быть доступны из любого места программы. Не является потокобезопасной, требует синхронизации при доступе из нескольких потоков.