散分200讨论JAVA的GC机制!!!!!!!!!!!!!!!!!!!!!!!!高手请进

hfree 2004-12-31 01:56:29
import java.util.* ;

class A {
protected void finalize(){
System.out.println("A is killed");
}
}


public class B1 {

public static void main(String[] args ) {
Vector v = new Vector() ;
for(int i=0;i<100;i++) {
A a = new A() ;
v.add(a) ;
// a = null ;
}
v = null ;
System.gc() ;
}
}

public class B2 {

public static void main(String[] args ) {
Vector v = new Vector() ;
if(true) {
A a = new A() ;
v.add(a) ;
// a = null ; 这一句第二次调试的时候请不要注掉.
}
v = null ;
System.gc() ;
}
}

这两个类,B1和B2,大家说会输出什么结果? 一试便知.但是为什么会有这样的结果呢?

我试到的是
B1,有输出A is killed
B2,无输出
B2,加上a = null,则有输出A is killed

在B2中,如果不加上a = null的话,是不是a一直都不会被finalize ?

大家讨论讨论吧,顺便也说一下GC的机制!


...全文
181 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hfree 2004-12-31
  • 打赏
  • 举报
回复
to sgdb(神天月晓)

我并非提倡使用System.gc(),这里使用只是为了调试程序.请理解我的问题
sgdb 2004-12-31
  • 打赏
  • 举报
回复
gc在水木上早就讨论过了,每个人都有自己的理由

我个人倾向不使用System.gc();

曾经看过一篇文章说System.gc()并不安全,但是我没测试过
hfree 2004-12-31
  • 打赏
  • 举报
回复
public class B {

public static void main(String[] args ) {
for(boolean i=true;i;i=false){
Vector b = new Vector();
{
A a1 = new A();
b.add(a1);
//a1 = null;
}
//b = null;
}
System.gc();
}
}
这里,采用for循环时,就算不显式b=null,a1= null ,也一样有输出,A is killed



goomoo 2004-12-31
  • 打赏
  • 举报
回复
学习,顶!
华生豆 2004-12-31
  • 打赏
  • 举报
回复
學習~~~
hfree 2004-12-31
  • 打赏
  • 举报
回复
to shandd(猜不透):
如果不用System.gc()的话,应该也会有输出的,不过可能要等N久.
shandd 2004-12-31
  • 打赏
  • 举报
回复
试了:
import java.util.* ;

class A {
protected void finalize(){
System.out.println("A is killed");
}
}




public class B2 {

public static void main(String[] args ) {
Vector v = new Vector() ;
if(true) {
A a = new A() ;
v.add(a) ;
a = null ;
}
v = null ;
//System.gc() ;
}
}
什么都不输出
过客猫2022 2004-12-31
  • 打赏
  • 举报
回复
一般而言,我们不用控制,用系统控制的。一般它会在系统空闲时运行,或资源不够时动行!它毕竞不是C++
zedk928 2004-12-31
  • 打赏
  • 举报
回复
不要灌水啊,不然给分都要给N个小时.
diewikwang 2004-12-31
  • 打赏
  • 举报
回复
回复人: lins(Anders*小明) ( ) 信誉:100 2004-12-31 14:06:00 得分: 0


java采用有向图搜寻机制!
从根出发(main方法)。凡是没有路径从根到达的都会被gc。所以。。。


这个搜索的机制会在某一个时刻触发(这个时刻用户无法控制),是不是?
羊城咩咩咩 2004-12-31
  • 打赏
  • 举报
回复
晕,把你的代码试了试,更离奇了。
import java.util.*;
public class B1 {

public static void main(String[] args ) {
Vector v = new Vector() ;
//for(int i=0;i<1;i++) {
A a = new A() ;
v.add(a) ;
//}
v = null ;
System.gc() ;
}
}
不拿注释,没输出,拿掉注释,输出一次A is killed!
hfree 2004-12-31
  • 打赏
  • 举报
回复
晕,老大,不要灌水啊,不然给分都要给N个小时.
viano 2004-12-31
  • 打赏
  • 举报
回复
新年快乐!


新年快乐!
hfree 2004-12-31
  • 打赏
  • 举报
回复
protected void finalize()
Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

回到B2,看上面的finalize解释,说是no more references ,那现在在B2中有一个指向A的引用a ,而且不为null,难道就意味着A对像不会被finalize ?
林仪明 2004-12-31
  • 打赏
  • 举报
回复
java采用有向图搜寻机制!
从根出发(main方法)。凡是没有路径从根到达的都会被gc。所以。。。
林仪明 2004-12-31
  • 打赏
  • 举报
回复
新年快乐!读书的学习进步!工作的工资进步!
beyondtkl 2004-12-31
  • 打赏
  • 举报
回复
如果强迫调用 gc会效率很低的 尤其频繁调用 就更低了。。

记得以前有了解一点 内存的使用,对象的引用 类似于某种引用计数机制
不过 这种只是理论上的 好像都没有采纳。。

哈哈 2年没看JAVA的 就记得这么点了。。^_^

62,614

社区成员

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

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