关于垃圾回收器的剖析
2007-08-03 12:13
393 查看
看了一些 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回收器(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的GC垃圾回收器的一些基本概念
- 关于lua垃圾回收器的理解
- 关于“最袖珍的垃圾回收器”的实现(序)
- 关于“最袖珍的垃圾回收器”的实现(头文件)
- 关于“最袖珍的垃圾回收器”的实现(C文件)
- 关于Java垃圾回收器(GC)的知识整理
- 【译】让垃圾回收器高效工作(二)
- 对G1垃圾回收器的理解
- 【译】让垃圾回收器高效工作(四)
- 关于今天面试回答的不好的两个问题(垃圾回收机制和对象的排序)
- 了解CMS(Concurrent Mark-Sweep)垃圾回收器
- 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
- 关于更清楚地了解.net的垃圾回收机制
- 关于java垃圾回收问题
- 垃圾回收器的原理
- JVM 垃圾回收器工作原理及使用实例介绍
- 案例剖析:关于优化外贸网店提高支付率
- 关于JAVA的引用和垃圾回收