堆、栈和方法区存储数据的区别

栈:为即时调用的方法开辟空间,存储局部变量值(基本数据类型),局部变量引用,对象属性的引用。当一段代码或者一个方法调用完毕后,栈中为这段代码所提供的基本数据类型或者对象的引用立即被释放;注意:局部变量必须手动初始化。


堆:存放引用类型的对象,即new出来的对象、数组值、类的非静态成员变量值(基本数据类型)、非静态成员变量引用。其中非静态成员变量在实例化时开辟空间初始化值。(类中属于全局变量的基本数据类型也存放在堆中)。一个java对象占用的内存空间,除了一个固定大小的空间用于描述这个对象属于哪个类,其它的就用于保存它的字段的值;堆比栈要大。


方法区:存放class二进制文件。包含类信息、静态变量,常量池(String字符串和final修饰的常量值等),类的版本号等基本信息。静态成员变量是在方法区的静态域里面,而静态成员方法是在方法区的class二进制信息里面(.class文件和方法区里面的二进制信息不一样,读取.class文件按照虚拟机需要的格式存储在方法区,这种格式包括数据结构方面。)因为是共享的区域,所以如果静态成员变量的值或者常量值(String类型的值能够非修改)被修改了直接就会反应到其它类的对象中。

基本类型的地址和值都存在栈中,但是两个相同值的基本类型的地址不同,其中的==比较被重写

成员变量存放在堆中,就算是int a[]=new int[10],也都是存放在堆中,包括a[2]=1.而局部变量存放于栈中

关于栈、堆和方法区详细介绍:https://blog.csdn.net/qq_36470686/article/details/82957221

你可能感兴趣的:(后端,存储数据,栈,堆,方法区)