java中堆和栈的区别

java内存分配

java程序在运行时会开辟出内存空间来使用,不同的内存区域的作用也不同。java中内存分配主要分为六个区域。

1:寄存器:这个在java程序中我们是无法控制的

2:栈:栈中主要是储存局部变量和引用变量。方法内的变量和循环内的变量都是局部变量,定义变量的时候方法就先进栈,,然后栈中就会分配出内存区域用来存储方法中的局部变量,但是局部变量有自己的作用域,一旦离开作用域(也就是方法使用完之后),变量就会被释放,所以栈中数据更新速度很快,局部变量的生命周期很短。

3:堆:堆中主要储存的是通过new关键字出来的对象,如果说栈中储存的是变量,那么堆中储存的就是实体,堆中储存的实体主要是封装了多个数据(其实就是对象的属性),如果一个数据消失,堆中的实体不会像栈中一样被随时释放,而是当你的实体不用了之后,java中会有一个垃圾回收机制对这些不用的实体进行垃圾回收处理。这里需要注意的是栈中的变量是不用初始化的,而堆中的数据是必须进行初始化的(这里系统会默认系统化),不同类型的数据有不同的初始化值。

4:常量池:存放常量

5:静态域:通过static定义的静态成员

6:非RAM存储:硬盘等永久储存空间

下面用例子详细说下堆栈:

比如定义一个数组

int[] a=new a[4];如果这个是在主函数中定义的,那么就这时主函数就先进栈中,在栈中定义了一个为a的变量,然后给a赋值,,而右边不是一个具体的值,而是一个实例,所以这时就在堆中分配了一个空间给这个实例,而栈中实际上就是赋给a的值就是一个地址,当栈中访问之后,就是访问这个地址,然后通过这个地址找到堆中的实例。接下来用图说明:

那么栈和堆之间是怎样联系的呢?

首先在栈中会先创建a,然后给a一个在堆中的地址,之后在堆中实例数组,这样就能通过地址找到堆中的数组了,这时a就不是基本数据类型了,而是引用数据类型了。如果没有给数组中的元素具体的值,堆中就会默认给其中的值初始化。

            基本数据类型的整数类型(byte、short、int、long)默认值是0;

            基本数据类型的浮点类型(float、double)默认值是0.0;

            基本数据类型的字符类型(char)默认值是'\u0000';

            基本数据类型的布尔类型(boolean)默认值是false;

            类型的引用类型(类、数组、接口、String)默认值是null.

总结下,栈和堆的区别

1.栈中储存的是局部变量和引用变量,而堆中储存的是实例。

2.栈中的数据寿命短,一旦没用就会被释放,而堆中的数据在不用之后不会立即消失,而是不定时的被垃圾回收机制回收。

3.栈中的数据更新速度大于堆。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值