堆和栈的区别
-
功能不同
栈内存用来存储局部变量和方法调用。
而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。 -
共享性不同
栈内存是线程私有的。
堆内存是所有线程共有的。 -
异常错误不同
如果栈内存或者堆内存不足都会抛出异常。
- 栈空间不足:java.lang.StackOverFlowError。
- 堆空间不足:java.lang.OutOfMemoryError。
- 空间大小
栈的空间大小远远小于堆的。
栈的组成
栈帧由三部分组成:局部变量区、操作数栈、帧数据区。局部变量区和操作数栈的大小要视对应的方法而定,他们是按字长计算的。但调用一个方法时,它从类型信息中得到此方法局部变量区和操作数栈大小,并据此分配栈内存,然后压入Java栈。
常见误区
- Java中的基本数据类型一定存储在栈中吗?
不一定。栈内存用来存储局部变量和方法调用。
- 如果该局部变量是基本数据类型,例如
int a = 1;
那么直接将该值存储在栈中。
- 如果该局部变量是一个对象,如
int[] array=new int[]{1,2};
那么将引用存在栈中而对象({1,2})存储在堆内。