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

时间:2012-04-17 06:25:18

标签: java garbage-collection finalize

我在java的system.gc()和finalize()方法之间混淆了。 我们不能强制将垃圾对象收集到JVM。我们允许在我们的java代码中编写这两种方法然后如果两者都用于垃圾收集,那么为java提供两种垃圾收集方法有什么意义呢?

请告诉我两种方法的确切工作方式以及内部工作方式?

8 个答案:

答案 0 :(得分:11)

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

  

运行垃圾收集器。

你无法控制垃圾收集器的“硬”程度。垃圾收集器如何在内部工作是特定于VM的,并且是一个独立的研究课题。但是通常会有“完整”的垃圾收集和一些较小的“增量”收集。因此,请将System.gc视为请求,但不保证会对您的对象进行垃圾回收。

可以覆盖

Object.finalize()来指定当给定对象被垃圾收集时要做什么(实际上在垃圾收集之前要做什么)。 Javadoc说:

  

垃圾收集时由垃圾收集器调用对象   确定没有对该对象的更多引用。

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

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

答案 1 :(得分: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.

答案 2 :(得分:1)

system.gc()方法通知JVM垃圾收集器现在可以通过删除未使用的对象来清除内存。根据java doc:

  

调用gc方法表明Java虚拟机花费了大量精力来回收未使用的对象,以使其当前占用的内存可用于快速重用。当控制从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间。

finalize()方法不会触发垃圾收集器,而是会在垃圾收集器中调用它来销毁对象。它提供了正确清除对象的说明。

答案 3 :(得分:1)

System.gc()方法垃圾收集由new关键字创建的对象,而当我们想要垃圾收集非使用new关键字创建的对象时,使用finalize()方法。所以,我猜这个答案。你的Q

答案 4 :(得分:0)

垃圾收集用于回收对象的已分配内存,垃圾收集器调用Finalize(),然后回收主要用于在删除之前执行某些操作的内存Finalize()方法对象

答案 5 :(得分:0)

有很多类包含finalize()方法,我假设你的意思是Object类中的那个。当您希望Java的垃圾编译器运行时,您可以调用System.gc()。它将每隔几分钟自行运行,但您可以随时要求它运行。当gargabe收集器运行时,它会在没有更多引用的每个对象上调用finalize()方法。基本上,System.gc()清理内存,并使用finalize()来删除单个对象。

答案 6 :(得分:0)

这里的答案很棒,只是想详细说明一下finalize()方法:你永远不应该使用它。 它的执行完全没有保证,最终使用finalize()会增加性能损失。

正如Joshua Bloch在Effective Java中所写:

  

终结器是不可预测的,通常是危险的   不必要。永远不要在终结者中做任何时间关键的事情。决不   依赖终结器来更新关键的持久状态。

  

哦,还有一件事:性能损失严重   使用终结器。在我的机器上,创建和销毁的时间   简单对象约为5.6 ns。添加终结器会增加时间   到2,400 ns。换句话说,创建速度慢约430倍   并使用终结器销毁对象。

首选使用以下资源终止try-finally模式,保证运行:

Bar bar = new Bar(...);
try {
    // Your code here
} finally {
    bar.releaseResource(); // You implementation. For example close connection
}

答案 7 :(得分:0)

通过在任何类上调用System.gc()方法来调用垃圾收集器。但它并不能保证在jvm关闭之前所有 nullified 对象都将被垃圾收集。所以基本上gc()方法只是垃圾收集那些使用new关键字创建的对象。对象是由任何其他逻辑创建的,而不是通过在finalize()调用垃圾收集器之前显式调用gc方法来进行垃圾收集。