Java栈空间与堆空间
以下是我自己在看别人的关于java栈与堆博客所总结的笔记如有大佬路过还请指出其中的错误
参考博客:https://www.cnblogs.com/ibelieve618/p/6380328.html
栈空间特点:1. 栈空间的存储空间较小,无法存放大量数据
2. 栈空间数据是按照先进后出的方式管理;
3. 栈空间存取数据效率高
4. Java将基本数据类型的数据存放到栈空间
堆空间特点:
1.堆空间的存取效率低
2.堆空间的空间大,可以容纳大量的数据
3.在堆空间中的数据存放的位置是随机分配的
Java对栈空间和堆空间的运用:
Java对栈空间的运用:当我们在创建一个变量时,在栈空间中会开辟一个空间来存放变量的类型和变量名。当我们在给基本数据类型赋值时他的值同样也是存放在栈空间中,而在给引用类型赋值时,变量名时存放在栈空间中而数据时存放在堆空间中。
Java对堆空间的运用:当我们创建的变量类型不是基本数据类型而是引用类型的数据时,就要用到堆空间,所以堆空间在java中存放的数据是引用类型的数据比如:数组、字符串、对象。
用四个例子来具体解释栈空间与堆空间:
例1:
第一步:这个例子中因为main函数是程序的入口所以JVM(java虚拟机不深讲感兴趣自己度娘)先执行,在栈空间中开辟一个String类型变量名为i的空间,同时赋值asdfsa;
第二步:JVM执行sd函数,在栈空间中开辟一个String类型变量名为i的空间,同时赋值d;
第三步:当sd()执行完后,变量i会立即释放掉,空间消失,但main()函数的空间仍然存在,变量i并未被释放所以不会受到影响。
例2关于数组:
执行String[]i =new String[3]
当JVM执行main函数时,在栈空间中开辟一个空间,存放数组变量i,同时在堆空间中也开辟一个空间,存放new String[3]数组,堆内存会自动分配首地址值(和身份证差不多),如0x0045。数组在堆内存中的地址值就会附给i,这样i就引用了这个数组(这就相当于给了i一把可以连接new String[3]数组的钥匙),这时因为数组中的元素没有附值,所以都为默认初始值0
例3还是关于数组的:
第一步和例2一样所以略;
第二步执行i = null
Null为空值,即i的引用的数组的内存地址被删除了,不在指向(引用)堆内存中的数组(相当于把在第一步给i的钥匙拿走了,使得i不能连接数组)。因为堆中的数组不在被i引用,所以被视为垃圾,JVM就会启动垃圾回收机制,不定时自动删除
例4不好意思还是关于数组的:
第一步和例2一样所以你们懂的;
第二步执行String[]y = i:在栈空间中开辟一个空间,存放数组变量变量y,并把i的内存地址值附给y,使得变量y也引用new String[3]数组;
第三步执行i = null:i不在指向(引用)堆内存中的数组,而变量y仍然指向数组,所以数组不会消失
例5关于对象:
不好意思没截图
Main()
Car c = new Car();
c.color = “blue”;
Car c1 = new Car();
c1.color = “red”;
第一步执行Car c = new Car():JVM执行main函数,在栈空间中开辟一个空间,存放对象c,同时在堆空间中也开辟出一个空间,用来存放new Car(),堆内存会自动分配首地址值。new Car()在堆内存中的地址值就会附给i,这样c就引用了这个数组.
第二步执行c.color = “blue”:
在对象c所引用的堆中添加进color = “blue”;
第三步执行Car c1 = new Car()和第四步c1.color = “red”:
同第一、二步一样
注意:在这个例子中虽然两个对象都是引用new Car()但两个对象是不同的,每一次使用new 关键字,实际上都会在堆空间中开辟出一个空间来容纳。