Chinaunix首页 | 论坛 | 博客
  • 博客访问: 26323179
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: Java

2009-09-21 19:30:59

在任何一个面向对象的语言中,这个对象销毁机制都是很重要的。因为如果对象不能够被及时的回收,那么很多没用的对象就仍然会占用内存地址。久而久之,就会导致内存耗竭,从而导致服务器当机。

在这个对象的销毁上,Java语言比其他面向对象的语言更胜一筹。因为其他面向对象的语言,需要在程序代码中手工回收废弃的对象。不过Java语言则不 同。在Java语言中拥有一套完整的对象垃圾回收机制。即程序开发人员不需要手工的回收废弃的对象。垃圾回收器将回收无用对象所占用的内存资源。不过这个 垃圾回收器并不是万能的,需要结合其他的对象回收方式,才能够最终解决这个对象回收的问题。在Java中,总共有三种方式可以用来解决对象回收的问题,笔 者将他们称为三把利剑。

第一把剑:垃圾回收器
垃圾回收器是Java平台中用的最频繁的一种对象销毁方法。垃圾回收器会全程侦测Java应用程序的运行情况。当反先有些对象成为垃圾时,垃圾回收器就会 销毁这些对象,并释放这些对象所占用的内存空间。在这里,程序开发人员需要知道,在哪些情况下垃圾回收器会认为这些对象是垃圾对象。通常情况下,如果发生 以下两种情况时,系统会认为这些对象是垃圾对象,需要销毁。

一是将一个NULL值赋值给对象。如用户先建立了一个对象str1。对象用完了之后,再利用赋值语句,将NULL值赋值给这个对象str1,即使用 str1=NULL的方式将NULL值赋值给这个对象。此时这个对象与内存中对象的存储地址之间就失去了联系。此时内存中的对象就好像成为了一个无主的对 象,就会被垃圾回收器销毁。不过这也有例外。如现在同一个对象有两个名字,分别为str1与str2。此时若只是将NULL值赋值给str1,那么内存的 这个对象仍然有一个主人,即str2。此时这个对象还暂时不会被垃圾回收器回收。除非在代码中讲这个对象所关联的所有对象名字都赋值为NULL。此时这个 对象才变为无主的对象,才会被垃圾回收器回收。在Java中定义自己的工具库

一般如果我们不需要某个对象了就可以直接将其赋为NULL了。这样有利于垃圾回收去回收数据!

二是对象其超出了作用范围,这个这个对象就被认为是垃圾对象,被被垃圾回收器回收并释放内存。其实对象跟变量一样,其也有作用域。当超过这个作用域的话, 跟变量一样,这个对象也就无效了,其他地方不能够再引用这个对象。此时这个对象就是名存实亡了。为此垃圾回收器也把这种超过作用范围的对象当作垃圾对象来 处理。所以说,如果程序员要让对象中的某些成员变量或者成员方法一直有效的话,就需要采用static关键字,让其在变量销毁时仍然有效,或则仍然可以调 用这些成员变量与成员方法。

第二把利剑:finalize方法
虽然说垃圾回收器已经是一个比较完善的对象销毁机制,但是其并不能够解决Java语言中所有对象的销毁问题。如Java语言平台中,创建对象主要有两种方 式,分别为利用NEW关键字来创建(这是对象创建的主要方式)与不适利用NEW关键字来创建。如果Java语言中某些对象不是利用new关键字为对象在内 存中分配一块存储区域,那么这种类型的对象就不能够被垃圾回收站回收。即使在代码中将NULL值赋值给这个对象,仍然不能够被垃圾回收器回收。虽然这种对 象比较少,但是毕竟存在。为了解决这类对象的回收与内存释放问题,在Java语言中提供了一个finalize的方法。通过这个方法可以显示的让系统回收 这个对象。这是一个Object类的方法。通常情况下,这个方法是被声明为protected。程序开发人员在必要的时候,可以在自定的类中定义这个方 法。假设现在程序开发人员定义了这个方法,那么在对象销毁时,垃圾回收器会先采用这个方法来销毁对象。并且在下一次垃圾回收动作发生时,最终释放对象的内 存。

可见,采用了finalize 方法,虽然可以让这个对象被垃圾回收器回收,但是其原理是不同的。垃圾回收器是先调用这个方法,然后在下次运行这个垃圾回收作业时再释放其占用的内存。另 外需要注意的是,这个方法并不一定会保证发生。也就是说,相对来讲,其安全性并没有垃圾回收器那么的高。故在实际创建对象时,最好还是采用new关键字来 创建比较安全,也更加的方便。因为在利用New关键字来创建对象时,在代码中不需要加入另外额外的代码。所以从安全性与便利性上来说,笔者都建议采用 new方法为对象在内存中分配存储区域,而不建议采用其他的方式。在采用垃圾回收器的时候,其会自动检测对象的状态,而不需要程序员告知。其发现对象超出 了作业域范围或者对象被重置为空时,其就会被自动销毁并释放对象所占用的内存,这种方式处理起来相对来说更加的安全与便利。

第三把利剑:利用System.gc方法强制启动垃圾回收器
垃圾回收器其实自动启动的。也就是说,垃圾回收机制起会自动监测垃圾对象,并在适当的时候启动垃圾回收器来销毁对象,释放内存。但是这个垃圾回收器也会有 不合作的时候。也就是说,这个垃圾回收器不受程序代码的控制,其具体执行的时间也会不确定,从而导致上面的finalize方法无法执行,某些对象无法及 时销毁。为此有时候需要利用代码来强制启动垃圾回收器,来销毁对象。

阅读(939) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~