Java基础-数组的内存分配


首先,先简单的来了解下Java中的内存分配

A:栈

栈是程序运行时单位,决定了程序如何执行,或者说数据如何执行。Java栈内存,以帧的形式存放本地方法的调用状态,包括方法调用的参数、局部变量、中间结果等(方法都是以方法帧的形式存放在方法区的),每调用一个方法就将对应该方法的方法帧压入Java 栈,成为当前方法帧。当调用结束(返回)时,就弹出该帧。

简单地讲:栈用于存储局部变量(定义在方法声明上和方法中的变量)

B:堆

java的堆是一个运行时的数据区,用来存储数据的单元,存放通过new关键字新建的对象和数组,对象从中分配内存。
在堆中声明的对象,是不能直接访问的,必须通过在栈中声明的指向该引用的变量来调用。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象

简单地讲:堆用于存储new出来的数组或对象

C:方法区

类似于代码区,存放代码,存放类的基本信息,先简单了解下,主要先理解上面的栈和堆,后文或继续讲解

本篇先主要了解堆和栈是什么。其实当我们把对象拆开,对象的属性就是数据,存放在JVM堆中;而对象的行为(方法),就是运行逻辑,放在JVM栈中。


数组的内存是如何分配的

	//由于本篇数组内存先仅涉及堆和栈,仅截取main主方法
	public static void main(String[] args) {
		int[] arr = new int[3];		//动态初始化,创建3块连续的空间
	}

生动理解栈:栈是一种先进后出的数据结构,类似于手枪的子弹夹,先压进去的子弹会最后发射出来。每一颗子弹相当于我们栈里面的栈帧,方法都是以栈帧形式存在的,所以当程序运行起来的时候,首先进入栈的为main主方法(主方法就类似子弹一样,最先压入栈底),当运行完就要弹栈(这里就是最后一颗子弹发射出去了)。如果main中还调用其他方法,那么这个方法也需以栈帧的形式入栈,以此类推,好比第二颗,第三颗...子弹都压入了弹夹,当方法运行完,则依次根据后进先出原则弹栈。

1.首先main方法会入栈,arr相当于我们定义在方法里的局部变量,是一个int数组类型的,那么应当在main方法中分配一个数组类型的变量,叫做arr

2.new出来的东西都应在堆里,所以会在堆内存创建一个实体,它有一个地址值(0x0011),再将它划分为三块连续的空间,有其对应索引值和默认初始化值。这里的默认初始化,将分配的存储空间初始化为二进制的零,便自动将所有基本数据类型设置为默认值了,引用则被设置成null。


当打印arr时,自然会打印出其地址值。上面说过堆内存中的实体不能被直接访问,现在arr可通过这个地址值找到其对应实体,打印arr[0]时,便会打印默认初始化值0

3.最后main方法运行完毕,弹栈,堆里分配的数组内存自然也变成了垃圾

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值