JAVA 垃圾回收

javafreshfish 2007-06-28 02:27:15
请看下面的程序运行的结果,

为什么垃圾回收器会连续回收两个最近的对象(4731hello2,4730hello2)

然后再从最前面回收(hello1)然后又回收两个最近的对象(4729hello2,4728hello2)

然后回收当前最前面的对象(1hello2)
而以后的规律却变成了

1.回收当前最近的对象(4727hello2)

2.回收当前最久的对象(3hello2)

3.重复执行上面1、2两个步骤。


我的系统是winxp jdk 用的是 1.6.0-beta2

为了能看到了这么多行结果我在Eclipse 中运行了这个程序


是不是所有的垃圾回收都是按这个规律回收的呀,
还是跟本就没有什么规律
我想知道它的工作过程



public class test {
static long time=1;
public test() {
}
public static void main(String[] args) throws Exception{
System.gc();
hello1 h1=new hello1();
h1=null;
for(long t=0;t<10000;t++){

System.out.println(t);

hello2 tt=new hello2();

if(t<4744) time=1;//经过多次实验,我的机子会在这附近进行垃圾回收
else time=500;
Thread.sleep(time);

}
}
}
class hello1{
static long count;
long con=0;
hello1(){
count++;
con=count;
}
protected void finalize(){
System.out.println("回收第"+con+"hello1");
}
}
class hello2{
static long count;
long con=0;
hello2(){
count++;
con=count;
}
protected void finalize(){
System.out.println("回收第"+con+"Hello2");
}
}


某一次程序执行后显示的代码:

1

2

......

4730

4731
回收第4731Hello2
回收第4730Hello2
回收第1hello1
回收第4729Hello2
回收第4728Hello2
回收第1Hello2
回收第4727Hello2
回收第2Hello2
回收第4726Hello2
回收第3Hello2

......
...全文
163 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
javafreshfish 2007-07-01
  • 打赏
  • 举报
回复
说的也对呀!!!
的确了解也没有多大意义!!!
现在才恍然大物!!!
beibeiG 2007-06-28
  • 打赏
  • 举报
回复
虚拟机自己干的事,咱们就不要费那劲去管了
zqrqq 2007-06-28
  • 打赏
  • 举报
回复
没有什么奇怪了,这个是JVM的策略问题!

内存回收策略完全是一个内部算法上的问题,对程序员来说,你只需要了解JVM留给你的接口参数,并合理的配置这些参数就可以了。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧