java中的finalization_java之finalization与GC

转载请注明出处

作者:小马

java 中的GC(garbage collection)并不像C++的析构函数一样每次对象被删除时调用,事实上它是一种JVM(JAVA 虚拟机)行为,JVM在它认为“合适”的情况下调用。这个所谓的合适情况,应用层其实不必考虑过多。可以认为GC调用的时机是随机的。

finaliztion是个可以被应用层重载的函数,当GC回收一个对象时,它会先调用对象的这个函数然后再处理其它事情。所以应用可以重载这个函数,去做一下想在GC前收尾的工作(听起来越来越像C++中的析构了,但是请注意调用时机)。

但是问题来了,GC本来就是内存回收了,应用还需要在finalization做什么呢? 答案是大部分时候,什么都不用做(也就是不需要重载)。只有在某些很特殊的情况下,比如你调用了一些native的方法(一般是C写的),可以要在finaliztion里去调用C的释放函数。

下面这个代码示例,重载了finaliztion,但是仅仅是为了观察GC的行为,类很简单,

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");

}

}

public void finalize()

{

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.println("all " + finalized + " finalized");

}

}

}

created和finalized用来跟踪分别创建和回收了多少对象,而对象的成员i可以理解为每个对象的号码,从代码上看,当号码为47的对象被回收时,把f置为true,这样main函数就不会创建新的Chair实例了,main函数如下:

public class Garbage

{

/**

* @param args

*/

public static void main(String[] args)

{

while(!Chair.f)

{

new Chair();

new String("to take up space");

}

System.out.println("after all chairs have been created:\n" +

"total finalized = " + Chair.finalized);

//optional arguments force garbage

//collection & finalization

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("run finalization():");

System.runFinalization();

}

}

System.out.println("byte!");

}

}

注意并不是说,创建了第47个对象时就开始回收,原因还是上面讲的回收时机问题。所以当i==47时,可以已经创建了几千个chair对象了。

输出结果:

Created 47

beginning to finalize after 4691 chairs have been created

finalizing chair #47, setting flag to stop chair creation

after all chairs have been created:

total finalized = 6151

byte!

main函数中的System.runFinalization()和System.gc是做什么的呢? 我个人的理解,这两个函数分别是应用层向JVM发出一个信号,告诉JVM,希望你能尽快的回收内存和调用对象的finaliztion方法,但是只是一个请求,而JVM只保证会尽最大的努力执行,但是具体什么时候执行以及会不会执行都是未知的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值