Java中的堆(heap)和栈(stack)

栈(stack)

    概念:用于存储局部变量,数据使用完毕之后,将自动释放。 优势: 在栈中的存取速度是比堆(heap)快的。 栈中的数据是可以共享的。

举例:

int A = 7; int B = 7; 1、首先"7"这个值,因为大小可知,生命期可知(在程序中定义使用,程序结束后就会消失。) 2、所以程序会在栈中去创建变量A,变量A中去存放7的值的地址。 3、现在又要去创建一个变量B,由于在栈中已经拥有了"7"这个值的地址,所以变量B将直接引用"7"的地址。 4、此时,变量A和变量B存放的地址,都是值为"7"的地址。这也就能体现,在栈中的数据是共享。

这个时候就有一个新的问题将抛出,如果这个时候让A=5。变量A和变量B的会一样吗?

1、首先编译器识别到A=5,会在栈中去搜寻是否存在值为"5"的地址。若存在,那么直接引用,若不存在,则会重新开辟新的地址去存放"5"的值。 2、所有无论在栈中变量A怎么变,变量B都不会发生改变,因为变量B的值始终都是"7",不会因为变量A的值改变而改变。
    缺点: 在栈中的数据的大小和生命期必须是确定的,不够灵活。

堆(heap)

    概念:通过new一个对象,或者创建一个数组的时候,就会在堆中开辟一部分空间用于存放。创建出来的对象都拥有默认值。当不在被使用的时候就会被自动回收处理。 优势: 在堆中,可以动态的去分配内存的大小,生命期也不需要提前准备好。 在Java的垃圾回收机制中,会自动回收不再使用的数据。 缺点: 因为堆是动态分配内存的,所以存取速度会较慢。

堆和栈的区别

    相同点: 都是Java内存的一种。 使用完毕之后,Java垃圾回收机制都会自动的去回收它们。 不同点: 栈内存: 栈内存中一般都会存放8种基本数据类型的变量、对象的引用和方法。 栈中遵循,先进后出的规则。 占内存中不能被其他线程所访问。 栈内存生命周期短。 堆内存: 存放new出来的对象和数组。 堆中遵循,先进先出,后进后出的规则。 存储在堆中的对象,是能够被全局是访问的。 堆内存生命周期是从,程序开始运行到运行结束。


经验分享 程序员 微信小程序 职场和发展