java应用程序执行的出口_JVM / GC是否在程序/线程出口上调用`finalize()`?

PS:我确实知道如何正确清理,而无需依赖finalize()。

Java是否不能保证在程序退出时会进行正确的垃圾回收?

例如,可以说我将一些数据保留在缓存中,而不是经常对其进行序列化,我还实现finalize()了这样一个希望:如果由于某种原因(崩溃除外),我的程序正常退出,那么缓存将被写入数据库/文件/一些-

由我的代码存储在finalize()方法中。但是根据下面的小实验,看来JVM似乎没有“优雅地”清理内存,而是退出了。

Java规范(请参阅程序出口)说没有什么关于出口时如何处理内存/

gc的信息。还是应该一直在查看规范的其他部分?

在Windows 7上,使用以下示例(末尾输出)使用1.6.0.27 64位

public class Main {

// just so GC might feel there is something to free..

private int[] intarr = new int[10000];

public static void main(String[] args) {

System.out.println("entry");

Main m = new Main();

m.foo();

m = new Main();

// System.gc();

m.foo();

m = null;

// System.gc();

System.out.println("before System.exit(0);");

System.exit(0);

}

@Override

protected void finalize() throws Throwable {

System.out.println("finalize()");

super.finalize();

}

public void foo() { System.out.println("foo()"); }

}

/*

* Prints:

* entry

* foo()

* foo()

* before System.exit(0);

*/

变化:

如果我取消注释任何人,System.gc()则否finalize()。

如果我都取消注释,System.gc()那么将finalize()被调用两次。

是否System.exit()被调用对是否finalize()被调用没有影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值