JVM堆和栈中内容的区别

从三个角度来分析这个问题

  • 存储的类型

  • 默认值

  • 生命周期

存储类型

1、堆上存储的是new出来的东西,是引用数据类型的实质——对象

  1. 栈上存储的是局部变量(基本数据类型和引用类型的引用)

默认值

  1. 堆上对象中的变量具有默认值:

  • 整形(byte、short、int、long)默认值为0

  • 浮点类型(float、double)默认值为0.0

  • 字符类型(char)默认值是'\u0000' 表示编码值为0的字符,一个绝对空字符。

  • 布尔类型(boolean)默认值是false

  • 引用数据类型默认值是null

  • null既不是对象也不是任何一种数据类型,它仅是一个特殊的值

  • 任何引用数据类型的引用都可以指向null,指向null并不意味着没有初始化,可以认为引用指向了虚无,反正没有指向任何一个对象。

  • 对象才是引用数据类型的实质,没有指向对象的引用实际上没有任何意义,指向null的引用是无法正常使用的!

  • 基本数据类型不能等于null

  1. 栈上的局部变量没有默认值,声明局部变量后必须显式的初始化,否则无法使用。

生命周期

1. 堆上的对象使用完毕后,随着方法的出栈,对象的引用就会被销毁。这个时候对象就没有引用指向它,而是"孤零零"的单独存在于堆上,这种对象意味着我们就无法再次使用它了,这种对象没有意义了。在Java中,我们把这种对象称之为`垃圾`或者`垃圾对象`,它们会等待垃圾回收器进行内存回收。

关于Java的垃圾回收机制(Garbage Collection简称GC):

  • 堆上的对象变成`垃圾`后,并不是立刻就会被回收,而是需要GC通过一系列的算法来决定它是否被回收。

  • Java的GC机制是全自动的,程序员几乎无法干涉和主动回收`垃圾`。这一方面为Java程序员的开发节省了大量的精力(无需花费大量精力来管理堆内存),相比于C++的全手动回收`垃圾对象`,Java在GC机制上的创新是Java能够如此流行的重要原因之一。但另一方面,一旦GC这种机制出现问题,对Java而言将会是非常难以解决的问题。

  • 垃圾回收是Java和C++之间的一道围墙,墙外的人想进来,墙内的人却想出去。

2. 栈上的局部变量的生命周期和栈帧保持一致。方法栈帧进栈后,局部变量开辟空间生效了,方法出栈后,局部变量就被销毁了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值