当前位置: 主页 > JAVA语言

java 栈内存 开辟数组-虚拟机内存分配的基本原理及使用方法

发布时间:2023-06-09 16:12   浏览次数:次   作者:佚名

学习时间:2

2020-11-18

学习内容:

Java虚拟机在执行Java程序的过程中会把它管理的内存划分成若干个不同的数据区域

A:栈: 存放的是局部变量

局部变量:在方法定义中或者方法声明上的变量都是局部变量。

java堆内存和栈内存的区别_java 栈内存 开辟数组_java堆和栈和内存的关系

B:堆: 存放的是所有new出来的东西(比如:int[] arr = new int[3];

定义了一个int类型的数组arr,这个数组可以存放3个int类型的值。)

特点:

a: 每一个new出来的东西都会为其分配一个地址值。

b: 每一个变量都有一个默认的值

byte,short,int,long类型默认值:0

java堆内存和栈内存的区别_java 栈内存 开辟数组_java堆和栈和内存的关系

float,double类型默认值:0.0

char类型默认值:’\u0000’

boolean类型默认值:false

引用数据类型类型默认值:null

c: 使用完毕就变成了垃圾java 栈内存 开辟数组,等待垃圾回收器对其回收

C:方法区:(面向对象部分讲解)

java 栈内存 开辟数组_java堆内存和栈内存的区别_java堆和栈和内存的关系

D:本地方法区:(和系统相关)

E:寄存器:(cpu使用)

如图所示:

在这里插入图片描述

我们在了解数组这一块内存分配的时候一般将其简化为以下几个部分:

1.栈内存 2.堆内存 3.方法区

java 栈内存 开辟数组_java堆内存和栈内存的区别_java堆和栈和内存的关系

public class Test { 
	public static void leftshift(int i, int j) { 
   		i+=j;
	} 
	public static void main(String[] args) { 
		int i = 4, j = 2; 
		leftshift(i, j); 
		System.out.println(i); 
	} 
}

程序的运行结果是4

内存图:

在这里插入图片描述

解释:

1、JVM在方法区编辑字节码文件Test.class

java堆和栈和内存的关系_java堆内存和栈内存的区别_java 栈内存 开辟数组

2、方法区调用main方法,栈内为main发放开辟一处空间

3、执行main方法中的代码java 栈内存 开辟数组,此时在main方法中i=4 j=2

4、执行到代码 leftshift(i,j); 方法区调用leftshift方法

5、执行leftshift方法中的代码i+=j; 此时在leftshift方法中i=6;

6、Leftshift方法出栈;

7、输出main方法中的i 赋值i=4 main方法出栈