java垃圾回收

当对象被创建时,就会在Java虚拟机的堆区中拥有一块内存,在Java虚拟机的生命周期中,Java程序会陆续地 创建无数个对象,假如所有的对象都永久占有内存,那么内存有可能很快被消耗光,最后引发内存空间不足的错误。因此必须采取一种措施来及时回收那些无用对象 的内存,以保证内存可以被重复利用。

在一些传统的编程语言(如C语言)中,回收内存的任务是由程序本身负责的。程序可以显式地为自己的变量分配一块内存空间,当这些变量不再有用时,程序必须显式地释放变量所占用的内存。把直接操纵内存的权利赋给程序,尽管给程序带来了很多灵活性,但是也会导致以下弊端:

 程序员有可能因为粗心大意,忘记及时释放无用变量的内存,从而影响程序的健壮性。

 程序员有可能错误地释放核心类库所占用的内存,导致系统崩溃。

在Java语言中,内存回收的任务由Java虚拟机来担当,而不是由Java程序来负责。在程序的运行时环境中, Java虚拟机提供了一个系统级的垃圾回收器线程,它负责自动回收那些无用对象所占用的内存,这种内存回收的过程被称为垃圾回收(Garbage Collection)。

垃圾回收具有以下优点:

 把程序员从复杂的内存追踪、监测和释放等工作中解放出来,减轻程序员进行内存管理的负担。

 防止系统内存被非法释放,从而使系统更加健壮和稳定。

垃圾回收具有以下特点:

只有当对象不再被程序中的任何引用变量引用时,它的内存才可能被回收。

 程序无法迫使垃圾回收器立即执行垃圾回收操作。

 当垃圾回收器将要回收无用对象的内存时,先调用该对象的finalize()方法,该方法有可能使对象复活,导致垃圾回收器取消回收该对象的内存。

11.4.1 对象的可触及性

在Java虚拟机的垃圾回收器看来,堆区中的每个对象都可能处于以下三个状态之一。

 可触及状态:当一个对象(假定为Sample对象)被创建后,只要程序中还有引用变量引用它,那么它就始终处于可触及状态。

 可复活状态:当程序不再有任何引用变量引用Sample对象时,它就进入可复活状态。在这个状态中,垃圾回收器会 准备释放它占用的内存,在释放之前,会调用它及其他处于可复活状态的对象的finalize()方法,这些finalize()方法有可能使Sample 对象重新转到可触及状态。

 不可触及状态:当Java虚拟机执行完所有可复活对象的finalize()方法后,假如这些方法都没有使Sample对象转到可触及状态,那么Sample对象就进入不可触及状态。只有当对象处于不可触及状态时,垃圾回收器才会真正回收它占用的内存。

图11-6显示了对象的状态转换过程。

对象的生命周期 - 飞毛腿--老鼠 - 星 龙 冰

图11-6 对象的状态转换图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值