Java中的System.gc()和finize()方法有什么区别?

2022-09-03 14:19:16

我在java的system.gc()和finize()方法之间感到困惑。我们不能强制将垃圾对象收集到 JVM。我们可以在java代码中编写这两种方法,那么如果两者都用于垃圾回收,那么为java的垃圾回收提供两种方法有什么意义呢?

请告诉我这两种方法的确切工作原理以及内部是如何工作的?


答案 1

System.gc()请系统执行垃圾回收。Javadoc 说:

运行垃圾回收器。

您无法控制垃圾回收器的“难度”。垃圾回收器的内部工作方式是特定于 VM 的,并且本身就是一个研究主题。但是通常有“完整”垃圾回收和一些较小的“增量”收集。因此,请考虑作为请求,但不能保证对象的垃圾回收会发生。System.gc

Object.finalize()可以重写以指定在垃圾回收给定对象时要执行的操作(实际上在垃圾回收之前要执行的操作)。Javadoc 说:

当垃圾回收确定没有更多对对象的引用时,由对象上的垃圾回收器调用。

终结器的经典用法是在垃圾回收对象时取消分配系统资源,例如发布文件句柄,临时文件等。

不要使用终结器在 JVM 退出时执行操作。为此,请使用向 注册的关机挂钩。Runtime.getRuntime().addShutdownHook(Thread)


答案 2

System.gc()强制运行垃圾回收器,而对象的方法定义垃圾回收器在收集此特定对象时应执行的操作。Finalize()

粗略地说,它是这样的:

class MyClass {
    public UnmanagedResource resource;

    void Finalize() {
        FreeUnmanagedResource(resource);
    }
}

MyClass[] data = new MyClass[1000];
for(int i=0; i<1000; i++) {
    data[i] = new MyClass();
}
//do some work
data = null;
System.gc(); //Note that it doesn't guarantee you that all MyClass instances will be actually collected at this point.