Java 你能指望调用.finalize()吗?
我试图对我的一些Java代码进行检测,以确保正确地对对象进行垃圾收集,但令人惊讶的是,它并没有像我预期的那样频繁地被调用 我现在想知道这是否是因为错误的仪器或我需要解决的实际内存泄漏。VisualVM探查器似乎指出了前者 令人担忧的是,我有一个线程处理请求,在请求中创建了数千个临时对象。有时,该线程写入的套接字意外关闭,线程遇到异常并死亡Java 你能指望调用.finalize()吗?,java,garbage-collection,Java,Garbage Collection,我试图对我的一些Java代码进行检测,以确保正确地对对象进行垃圾收集,但令人惊讶的是,它并没有像我预期的那样频繁地被调用 我现在想知道这是否是因为错误的仪器或我需要解决的实际内存泄漏。VisualVM探查器似乎指出了前者 令人担忧的是,我有一个线程处理请求,在请求中创建了数千个临时对象。有时,该线程写入的套接字意外关闭,线程遇到异常并死亡 当线程终止时,这些对象似乎从未调用过.finalize()。这是不信任我的仪器的原因吗?否。不能保证它会被调用。然而,它通常被称为。这可能是因为您没有正确地释
当线程终止时,这些对象似乎从未调用过.finalize()。这是不信任我的仪器的原因吗?否。不能保证它会被调用。然而,它通常被称为。这可能是因为您没有正确地释放对象,或者垃圾收集器没有运行,或者终结器线程正在等待运行的好时机
您可以在语言规范的部分了解它。Finalize()不是解决方案。您无法知道何时将调用终结器(如果有的话)。如果您的问题是异常,请使用
try/catch/finally
block并关闭/清除所有要在finally block中关闭的内容。这保证了在两种情况下都会清理所有内容:逻辑正常终止或抛出异常 根据我阅读的所有Java基础知识,您应该永远不要依赖finalize来运行。finalize()不是析构函数,您可能从其他语言中知道
从java.lang.Object javadoc:
The Java programming language does not guarantee which thread will invoke the finalize method for any given object.
()
在我看来,可怕的finalize应该而且只有在应用程序中包含一些本机代码时才使用。但即便如此,也不要依赖它。您的困惑似乎在于是否存在内存泄漏。您试图通过查看是否调用了
finalize()
来确定这一点。如果是这样的话,那么检查是否存在内存泄漏是不正确的
我们很清楚,在Java中,主要是指对不需要的对象的隐藏引用
finalize()
的目的是让开发人员有机会清理自己的混乱(连接、流等)。内存被认为是JVM的麻烦,由GC清理
因此,简而言之,“GC保证在释放内存之前调用finalize()
”,这一事实不应被解释为“如果未调用finalize()
,则存在内存泄漏”。这可能只是因为该对象尚未被垃圾收集
如果要查找内存泄漏,请使用工具。见选项: