Java 中堆和栈的区别是什么?
Java 中堆和栈的区别是什么?
回答重点
栈(Stack):主要用于存储局部变量和方法的调用信息(如返回地址、参数等)。在方法执行期间,局部变量(包括引用变量,但不包括它们引用的对象)被创建在栈上,并在方法结束时被销毁。
堆(Heap):用于存储对象实例和数组。每当使用 new 关键字创建对象时,JVM 都会在堆上为该对象分配内存空间。
扩展知识
从其他方面进一步区分
- 生命周期:我们知道JVM里面的垃圾回收主要是对堆空间的处理,而栈空间是不会被回收的,所以栈空间的生命周期都非常的短,比如一次方法的调用,调用的时候存入,执行完成就被弹出释放。而堆空间是需要通过GC进行回收的。所以堆空间的数据生命周期会相对较长!
- 空间大小:栈的空间大小都是固定的,根据操作系统决定,如果是64位的则大小为8个字节。但是堆的空间大小并不确定,根据对象的大小进行一个划分
特别注意,如果定义的变量是一个基本数据类型,比如int a = 10;这个时候并不会分配堆内存,10 会直接存在栈空间。
如果是引用数据类型,比如A a = new A();这种 a 分配到栈空间是一个地址,指向堆中的实例化的A。
如果 A 中定义了一个属性B b = new B();这个b并不会存在栈空间,而是直接放在堆空间,存储的是实例化的B的地址!
Comments