Java中堆内存(heap)和栈内存(stack)的区别
作者:互联网
在Java代码中,常常会使用到这样的类的声明实例化:
Person per = new Person();
//这其实是包含了两个步骤,声明和实例化
Person per = null; //声明一个名为Person类的对象per
per = new Person(); // 实例化这个per对象
声明 指的是创建类的对象的过程;
实例化 指的是用关键词new来开辟内存空间。
它们在内存中的划分是这样的:
那什么是栈内存和堆内存呢?
栈内存:
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。栈内存主要存放的是基本类型类型的数据 如( int, short, long, byte, float, double, boolean, char) 和对象句柄。注意:并没有String基本类型、在栈内存的数据的大小及生存周期是必须确定的、其优点是寄存速度快、栈数据可以共享、缺点是数据固定、不够灵活。
栈共享:
int a = 10;
int b = 10;
编译器先处理int a = 10;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有10这个值,如果没找到,将3存放进来,然后将a 指向10。接着处理int b = 10;在创建完b的引用变量后,因为在栈中已经有了10这个值。这样,就出现了a与b同时指向10的情况。如果再令a = 45;那么编译器会重新搜索栈中是否有5值,如果没有,则将5存放进来,并令a指向5;如果已经有了,则直接将a 指向这个地址。因此a值的改变不会影响b的值
注意:这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a 的修改并不会影响到b,它是由编译器完成的,有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量
堆内存:
堆内存用来存放所有new 创建的对象和 数组的数据,java的堆是一个运行时数据区,类的对象从中分配内存空间,用来存放由new创建的对象和数组。
1 2 3 4 5 6 7 8 9 10 11 |
|
创建了两个引用,创建了两个对象。两个引用分别指向不同的两个对象。以上两段代码说明,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。
标签:10,中堆,Java,String,对象,per,内存,new 来源: https://blog.csdn.net/sinat_39373192/article/details/86692162