作用域与垃圾回收机制

作用域:一般只针对变量类型而言。

Java语言中,变量的生命周期的概念,会占据程序设计中非常重要的部分。变量需要存活多长时间,如果想要销毁对象,可在什么时刻进行?

首先了解作用域的作用:它决定了在其内定义的变量名的可观性和生命周期。Java中,作用域是由花括号决定的。如:
{
Int x =10;
····
}
在作用域里定义的变量只可用于作用域结束之前。

堆内存与栈内存

堆内存:一种通用的内存池,位于RAM(随机访问存储器,也叫主存),用于存放所有的对象。它的特点是:编译器不需要知道存储的数据在堆里存好多长时间。当需要一个对象时,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。
小问题:如何防止这些对象填满内存空间呢?
答:这就需要垃圾回收机制了。

栈内存:也位于RAM中,可以通过栈指针从处理器哪里获得直接支持。向下移动时,分配新的内存;栈指针向上移动时,释放那些栈内存。用于存放基本数据类型以及对象的引用。

栈内存是受作用域的影响的。当作用域结束时,该作用域里的数据也会在相应的栈内存里销毁。

对象在内存中的状态,一般有三种状态描述:

1.可达状态:当一个对象被创建后,若有一个以上的引用变量引用它,则这个对象处于可达状态。此种状态下,引用变量可以调用该对象的成员变量和方法。

2.可恢复状态:假如程序不再有任何引用对象来引用它,则它这时进入可恢复状态。
这种状态下的对象可调用finalize()方法重新让一个引用变量引用该对象,则这个状态可进入可达状态。

3.不可达状态:即对象在调用finalize()后任然没有使对象成为可达状态,则这个对象将永久性的失去引用,最后变成不可达状态,这是系统就会回收该对象所占用的资源。

转换示意图:
这里写图片描述

垃圾回收机制

垃圾回收机制是相对堆内存中的对象而存在的,因为对象存放于堆内存中,且不会自动销毁,所以就有了垃圾回收机制来销毁对象,从而实现了对象的销毁。应当注意的是,垃圾回收机制不会回收任何物理资源(网络io,数据库连接,持久化对象等)。
上图中,只有当对象在不可达状态时,才有可能被垃圾回收机制回收。

注:finalize()方法是Object 类里的方法,可以重写该方法。
finalize()也不一定会被执行,它具有一定的随机性,系统没有产生严重的内存需求时,垃圾回收机制不会试图回收该对象,也不会调用finalize()方法。

问题:当程序全部执行结束后,堆内存中创建的对象是否还会存在?
答:有可能存在。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值