Java栈空间与堆空间

以下是我自己在看别人的关于java栈与堆博客所总结的笔记如有大佬路过还请指出其中的错误

参考博客:

栈空间特点:1. 栈空间的存储空间较小,无法存放大量数据

2. 栈空间数据是按照先进后出的方式管理;

3. 栈空间存取数据效率高

4. Java将基本数据类型的数据存放到栈空间

堆空间特点:

1.堆空间的存取效率低

2.堆空间的空间大,可以容纳大量的数据

3.在堆空间中的数据存放的位置是随机分配的

Java对栈空间和堆空间的运用:

Java对栈空间的运用:当我们在创建一个变量时,在栈空间中会开辟一个空间来存放变量的类型和变量名。当我们在给基本数据类型赋值时他的值同样也是存放在栈空间中,而在给引用类型赋值时,变量名时存放在栈空间中而数据时存放在堆空间中。

Java对堆空间的运用:当我们创建的变量类型不是基本数据类型而是引用类型的数据时,就要用到堆空间,所以堆空间在java中存放的数据是引用类型的数据比如:数组、字符串、对象。

用四个例子来具体解释栈空间与堆空间:

例1:

java堆空间满了释放 java 堆空间_堆内存

第一步:这个例子中因为main函数是程序的入口所以JVM(java虚拟机不深讲感兴趣自己度娘)先执行,在栈空间中开辟一个String类型变量名为i的空间,同时赋值asdfsa;

第二步:JVM执行sd函数,在栈空间中开辟一个String类型变量名为i的空间,同时赋值d;

第三步:当sd()执行完后,变量i会立即释放掉,空间消失,但main()函数的空间仍然存在,变量i并未被释放所以不会受到影响。

 

 

 

例2关于数组:

 

java堆空间满了释放 java 堆空间_数据_02

执行String[]i =new String[3]

  当JVM执行main函数时,在栈空间中开辟一个空间,存放数组变量i,同时在堆空间中也开辟一个空间,存放new String[3]数组,堆内存会自动分配首地址值(和身份证差不多),如0x0045。数组在堆内存中的地址值就会附给i,这样i就引用了这个数组(这就相当于给了i一把可以连接new String[3]数组的钥匙),这时因为数组中的元素没有附值,所以都为默认初始值0

 

例3还是关于数组的:

 

java堆空间满了释放 java 堆空间_数据_03

第一步和例2一样所以略;

第二步执行i = null

Null为空值,即i的引用的数组的内存地址被删除了,不在指向(引用)堆内存中的数组(相当于把在第一步给i的钥匙拿走了,使得i不能连接数组)。因为堆中的数组不在被i引用,所以被视为垃圾,JVM就会启动垃圾回收机制,不定时自动删除

例4不好意思还是关于数组的:

 

java堆空间满了释放 java 堆空间_java_04

第一步和例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 关键字,实际上都会在堆空间中开辟出一个空间来容纳。