java - 垃圾收集器不工作?

标签 java garbage-collection

我的JDK版本是1.7.0_25

class A { 
    public void finalize() {
        System.out.println("deleting...");
    }
}

public class Test {
    public static void main(String[] args) {
        new A();
        System.gc();
        System.out.println("main class");
    }
}

我预计输出为

deleting...
main class

但就我而言,没有输出,原因是什么?当我使用 JDK 1.7.0_09 在线编译并运行代码时,输​​出为,

main class
deleting...

为什么“主类”首先打印?

最佳答案

GC 永远不会保证清理何时发生,

finalize() 

可能会被调用,也可能不会被调用。

通过执行System.gc();,您只是请求调用 GC,但由 JVM 来满足您的请求。

System.gc() 会调用清理吗?

答案会因多种因素而异,例如您运行的 JVM、它所处的模式以及它使用的垃圾收集算法。

我不会在你的代码中依赖它。如果 JVM 将抛出 OutOfMemoryError,调用 System.gc() 不会阻止它,因为垃圾收集器将在达到这种极端情况之前尝试释放尽可能多的内存。

所以...如果您确实想要执行任何操作,请不要在 finalize() 中编写该代码

关于java - 垃圾收集器不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22779355/

相关文章:

java - UrlRewriteFilter 直接转https

c# - 我如何调查终结队列和终结幸存者

c - 从 Haskell 释放 C 运行时分配的内存

c# - 既然 .NET 有一个垃圾收集器,为什么我们需要终结器/析构器/dispose-pattern?

java - 如何创建一个在给定范围内随机打乱数字的 int 数组

java - 该表达式的目标类型应该是函数接口(interface)

java - String.h 中是否有返回子字符串的内置函数?

java - 使用 Eclipse 将 Java 项目导出到 JAR 时出现 "duplicate entry"错误

c# - 溢出我的内存,强制垃圾收集器?

c# - ASP.NET:在某些情况下我应该担心内存泄漏吗? [C#]