垃圾回收器的使用方法

文章作者 100test 发表时间 2007:10:15 12:40:49
来源 100Test.Com百考试题网


  看了一些 Thinking in java 这本书后,让我对JAVA的垃圾回收器开始研究起来。 经过摸索,发现java回收器(GC,一下用GC代替回收器)并不是象一般人想像的那样定期的回收垃圾,从而让你完全不用当心内存的问题。事实是,JAVA还是存在内存溢出的时刻,只所以一般的系统和开发人员没有这么认识到,或者没有遇到,只是因为java jvm帮我们默默无闻的做了一些力所能及的处理!!其实,GC的工作原理是非常的复杂,以至于很多人没法说清楚,在这里,我就个人的理解, 总结一下:

1.GC并不是定期来回收你的垃圾内存,即是根据需要来回收。

2.GC的回收是因为:它认为你的系统已经开始内存紧张(这个就是jvm的神奇)

3.即使GC开始准备清理你的垃圾内存,但是如果该内存的引用还存在(不等于null), 这个时候GC仍然无能为力!

看看下面的两个例子就知道了。
例子一:
public class finalizeTest{
public boolean checkout = false.
public void checkIn(){
this.checkout = true.
}
public void finalize(){
if (checkout)
{
System.out.print("the erroe").
}
}
public static void main(String[] args)
{
finalizeTest test = new finalizeTest().
test.checkIn().
System.gc().
System.out.println("Hello World!").
}
}

  本来希望通过System.gc()命令来强制执行finalize()来处理清理事务,但是事与愿违,它没有执行。 只要main方法没执行完,永远都不会被回收。原因很简单,在main方法内 finalizeTest test = new finalizeTest(). 后的“System.gc().”是要求系统去回收垃圾。系统线程此时显然有闲暇时间,经过判断,发现test仍然引用着finalizeTest对象。所以,不会去回收test。

例子二:
public class TestGC{
public void finalize(){
System.out.print("the erroe").
}
public static void main(String[] args)
{
TestGC test = new TestGC().
test = new TestGC().
test = null.
System.gc().
System.out.println("Hello World!").
}
}
  test = null,让test失去了对new TestGC()的引用。new TestGC()对象没有任何人在引用。在你申请GC的时候,就被回收了。因为此时系统只运行你一个线程(还有其他后台辅助的)当然有空闲时间,于是立刻回收了你的。程序输出“the erroeHello World!”。

相关文章


垃圾回收器的使用方法
解析JAVA中的内存分配
Java版通用JS级联
JAVA语言内存泄漏问题
Java程序基础入门必看
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛