Java虚拟机(JVM),它从操作系统分配一些内存,JVM使用该内存创建对象和实例,该内存称为Java堆。Java堆用作动态内存分配。它主要位于地址的底部,并且在堆大小变满时收集垃圾。将存储的局部变量和方法调用位于称为堆栈的指定内存中。堆栈存储器遵循后进先出(LIFO)的规则。堆栈称为静态内存分配。与堆内存大小相比,内存栈的大小更小。

让我们详细研究Java Heap和Stack:

Java堆分为两个主要部分,即Young space和Old space。幼小的空间是Java堆内存的一部分,它被分配或保护用于存储新对象的创建。当此空间已满并在一定时期内有效并且现在不使用这些空间时,它将移至其他部分,即“旧”空间,该空间保留用于存放旧物体。
在Java Heap中,垃圾回收是清除已死或未使用的对象的过程,这有助于从堆中释放空间并为新对象或实例腾出空间。
在调用该方法时,其堆栈框架将放在调用堆栈的顶部。堆栈框架保存方法的状态,该方法具有要执行的特定代码行和所有局部变量。堆栈的当前运行方法始终是堆栈顶部的方法。
调用该方法以保存方法的值和对象引用时,已在堆栈中创建了该块。方法执行后,该块不再使用,并变为空闲状态,可用于下一个方法。
堆栈用于执行线程。每个线程都有Java虚拟机堆栈,而JVM堆栈存储框架。这些方法分配给堆栈内存,并且访问内存的速度非常快。我们无法更改Java虚拟机堆栈,只能通过在Java堆栈上进行推入和弹出操作来完成。随着push和pop对局部变量的处理,Java堆栈变得越来越大和越来越小。JVM在方法调用和返回中发挥作用。简单来说,Java Stack将存储方法和变量。

Java堆和堆栈之间的主要区别
下面解释了一些要点,这些要点显示了Java Heap与Stack之间的区别

Java Heap是内存的一部分,可以按任何顺序存储和删除元素。在堆栈中,可以按照后进先出(LIFO)的规则存储和删除元素。
当Java堆被完全占用时,它将抛出内存不足错误或Java堆空间错误。当堆栈内存被占用时,它将引发堆栈溢出错误。
对于Java Heap,可以使用Xms和Xmx Java虚拟机选项来定义起始大小和最大大小。对于Java Stack,可以使用Xss JVM定义堆栈内存的大小。
创建新对象后,它将简单地存储在Java堆内存中。新对象的引用已存储在堆栈存储器中。
当用户对运行时所需的数据量一无所知时,可以使用Java堆。当用户在编译之前确切知道所需的数据量时,可以使用堆栈。
在堆中,不依赖任何元素访问其他元素。任何元素都可以随时随机访问。在堆栈中,有特定的顺序访问元素。
堆更为复杂,因为有时它不知道内存是被占用还是空闲。在一个堆栈中,这很容易。