System.runFinalization() 和 System.gc() 的区别(没分就没人回说~~~)

FBugFramework 2005-04-12 04:52:20
看Thinking in java.pdf里面关于这两个函数。稀里糊涂的;(P210-212)
做了n多测试后终于清楚了许多。;;;;;;

System.runFinalization();//好象是在可用内存不足的时候由系统分配执行清理
System.gc(); //到这里时后强制执行清理工作

如果不对,还请各位指正;

F@0
F@1
F@2 这三个为注释行是否有效(True 为不注释;False为注释掉了)
F@1和F@2是或的关系;
测试代码(书上的):
class Chair {

static boolean gcrun = false;
static boolean f = false;
static int created = 0;
static int finalized = 0;
int i;

Chair() {
i = ++created;
// if( created == 47 )
// System.out.println("Created 47");
System.out.print("Created:");
System.out.println(i);

//F@0: if(i >= 1000) f = true;
}

public void finalize() { //开始清理的时候自动调用它.
System.out.println("i" + i + ":" + created + " this=" + this.i);
if( !gcrun ) {
gcrun = true;
System.out.println("Beginning to finalize after " + created + " Chairs have been created");
}
if( i == 47 ) {
System.out.println("Finalizing Chair $47, Setting flag to stop Chair creation");
f = true;
}
finalized++;
if( finalized >= created){
System.out.print("All " + finalized + " finalized");
}
System.out.println("-----end finalized;");
if( i>=10000 ) {
System.out.println("- - - - - - - - - stoped - - - - - =");
f = true;
}
}
}

public class Garbage {
public static void main(String args[]) {

// System.runFinalization(); // 没效果。或许是调用它的时候垃圾不需要清理
while( !Chair.f ) {
new Chair();
new String("-------------------------------------");
//F@1 if( (Chair.created % 2) == 1 ) System.gc();
// System.gc(); // 强迫执行垃圾回收器。
//F@2 System.runFinalization(); // 好象是在可用内存不足的时候由系统分配执行清理
}
System.out.println( "After all Chair have been Created:\n Total Created = " + Chair.created + " Total finalized = " + Chair.finalized);
if( args.length > 0 ) {
if( args[0].equals("gc") || args[0].equals("all") ) {
System.out.println("gc():");
System.gc();
}
if( args[0].equals("finalize") || args[0].equals("all") ) {
System.out.println("runFinalization():");
System.runFinalization();
}
}
System.out.println("bye!");
}
}
...全文
674 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
FBugFramework 2005-04-13
  • 打赏
  • 举报
回复
jie
FBugFramework 2005-04-13
  • 打赏
  • 举报
回复
TO :watcher_shen
只是起步点不同。也没什么的,我会C++;还有就是每晚都看到1点。有些拼命而已。
或许你在我的基础上的话可能比我强多了。


TO :OnlyFor_love
你的观点我在哪里看到过。不过按照我的调试结果来看。和你的看法有些不一样哦。
runFinalization()方法的效果不明显。用不用没多少区别。
OnlyFor_love 2005-04-13
  • 打赏
  • 举报
回复
gc在大部分状况下会将没有任何指向的引用的内存释放掉,除非在特殊情况下,最好不要干涉gc!
runFinalization()方法在调用时它会尽量去调用这个对象的finalize方法!
都是强制gc去回收内存,其它大部分相似!
watcher_shen 2005-04-13
  • 打赏
  • 举报
回复
楼主学习java一周就能做这样的试验,真是令我佩服~我学一周的时候连hello world都没调对呢……

楼主,生活还得carry on~
FBugFramework 2005-04-13
  • 打赏
  • 举报
回复
函数 runFinalization() 没起什么效果。
写不写系统都自动会调用。只是地方不同。

我在两台机器上做测试,系统都在两个点(全部都在那两个范围段,见下面)上进行清理;
其中有一台机器:有一个点是相同的。同时运行大游戏的时候。会发生变化。
不过都在这两个范围段。结束游戏后。两个点都复位。


Created:900
i====================================900
0
1
2
...
200-500 :-> POINT 1
...
9999
Created:901
...
Created:901
...
901-1000 :-> POINT 2(有一台机器。不管是不是调用了finalize(),都在这里)
...
Created:1000
After all Chair have been Created:
Total Created = 1000 Total finalized = 47
bye!
yneos 2005-04-12
  • 打赏
  • 举报
回复
晕,怎么说什么的都有啊
FBugFramework 2005-04-12
  • 打赏
  • 举报
回复
哈哈哈。。

今天是刚好被她甩了1周纪念日。也是我学java的1周纪念日。

好好纪念纪念。也发誓要狂学java。
飞行的兔子 2005-04-12
  • 打赏
  • 举报
回复
枝上柳棉吹有少,天涯何处无芳草!
楼主,日子还是要过的,呵呵!
FBugFramework 2005-04-12
  • 打赏
  • 举报
回复
没办法。这年头。被美女甩了。
极度3心ing...
不这样做的话。日子都没法过了。
007remember 2005-04-12
  • 打赏
  • 举报
回复
^_^
楼主您太逗啦
^_^
FBugFramework 2005-04-12
  • 打赏
  • 举报
回复
to: zhutouzip

谢谢你哦。

to:007remember;
我再次向毛zx发誓给你分。我明天中午结帖。
FBugFramework 2005-04-12
  • 打赏
  • 举报
回复
哦。我运行了魔兽3后。一边游戏。一边玩的时候。发现 不在这两个地方了。
不过结束后又回到这两个点上。。。

呵呵。。差不多清楚了。
007remember 2005-04-12
  • 打赏
  • 举报
回复
再顶
飞行的兔子 2005-04-12
  • 打赏
  • 举报
回复
你看看thinking in java,上面说垃圾回收器会在它判断"可用内存数量不足时"时才开始执行,但究竟何时jvm才认为可用内存不足呢?好像我们人为情况下不知道,所以这种情况是有些含糊,甚至于我们不知道究竟何时finalize方法会执行,所以里面带了一点随机性!
FBugFramework 2005-04-12
  • 打赏
  • 举报
回复
我就是想清楚JVM是在什么情况下执行finalize()方法的。
感觉有些含糊。不可理解。
飞行的兔子 2005-04-12
  • 打赏
  • 举报
回复
你是说j=214和i=970时程序都执行了这部分代码?
FBugFramework 2005-04-12
  • 打赏
  • 举报
回复
构造到970的时候。并没有执行/调用 runFinalization()函数。

不过我还有点疑问。如果真是不需要调用runFinalization();方法finalize是系统按照内存不足的时候再调用执行的话。那为什么我每次运行的结果都是不变的。也就是都在j=214和i=970的时候在执行。

按道理应该出现不同的结果啊 ?不应该固定在这两个地方啊。
飞行的兔子 2005-04-12
  • 打赏
  • 举报
回复
唉,不想看你的测试结果了,原来我也看过这个例子,你认为有什么不对么?
FBugFramework 2005-04-12
  • 打赏
  • 举报
回复
哈。。我也发现了这个问题。刚才我一直在调试;

就是我不能在回复了。。呵呵。。回复的内容都已经写好了~~

看下面的结果:。代码方面我稍做了修改。。。
------------------------------------------------------------------
好象不对。runFinalization()调用runFinalization()是随机的。
我把源代码中Line46的 new Chair();改成下面的if语句:
if( new Chair().i==900 ) {
System.out.println("i====================================900");
for( int j=0; j<10000; j++ ) {
System.runFinalization();
System.out.println(" " + j);
}
}

F@0: True
F@1: False
F@2: False
D:\MyJava>javac Garbage.java
D:\MyJava>java Garbage >> c:\result2.txt
D:\MyJava>
结果确是------
Created:1
Created:2
Created:3
...
Created:899
Created:900
i===========================900
0
1
2
...
212
213
214
i900:900 this=900
Beginning to finalize after 900 Chairs have been created
-----end finalized;
i899:900 this=899
-----end finalized;
i898:900 this=898
-----end finalized;
215
216
217
....
9997
9998
9999
Created:901
Created:902
Created:903
Created:904
....
Created:968
Created:969
Created:970
i901:970 this=901
-----end finalized;
i969:970 this=969
-----end finalized;
i902:970 this=902
-----end finalized;
.....
i934:970 this=934
-----end finalized;
i936:970 this=936
-----end finalized;
i935:970 this=935
-----end finalized;
Created:971
Created:972
Created:973
....
Created:998
Created:999
Created:1000
After all Chair have been Created:
Total Created = 1000 Total finalized = 72
bye!
飞行的兔子 2005-04-12
  • 打赏
  • 举报
回复
finalize方法是当jvm在得知内存不够时调用,但在何时内存不够没有一个明确的标准,也就是jvm调用这个方法是随机的!
加载更多回复(11)

62,615

社区成员

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

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