JVM中栈(stack)与堆(heap)的区别

it2023-10-26  73

java程序是在JVM上运行的,所以此处说的堆和栈是指JVM内存区域的堆和栈。区别如下: 1、物理地址 堆的物理地址是不连续的,性能相对较慢,是垃圾回收区工作的区域。在GC时,会考虑物理地址不连续,而使用不同的算法,比如复制算法,标记-整理算法,标记-清楚算法等。 栈中的物理地址是连续的,LIFO原则,性能较快。 2、内存分别 堆因为是不连续的,所以分配的内存是在运行期确认的,因此大小不固定,一般堆大小远远大于栈。 栈是固定大小的,所以在编译期就确认了。 3、存放内容 堆中存放的是对象实例和数组,该区域更关注的是数据的存储 (静态变量放在方法区,静态对象仍然放在堆中) 栈中存放的是局部变量,栈针,操作数栈,返回结果等。该区更关注的是程序方法的执行。 4、程序的可见度 堆是线程共有的,栈是线程私有的。 5、异常错误 如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。 -Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的最大值
最新回复(0)