Java 中堆和栈的区别是什么?

Sherwin.Wei Lv8

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