Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 你能指望调用.finalize()吗?_Java_Garbage Collection - Fatal编程技术网

Java 你能指望调用.finalize()吗?

Java 你能指望调用.finalize()吗?,java,garbage-collection,Java,Garbage Collection,我试图对我的一些Java代码进行检测,以确保正确地对对象进行垃圾收集,但令人惊讶的是,它并没有像我预期的那样频繁地被调用 我现在想知道这是否是因为错误的仪器或我需要解决的实际内存泄漏。VisualVM探查器似乎指出了前者 令人担忧的是,我有一个线程处理请求,在请求中创建了数千个临时对象。有时,该线程写入的套接字意外关闭,线程遇到异常并死亡 当线程终止时,这些对象似乎从未调用过.finalize()。这是不信任我的仪器的原因吗?否。不能保证它会被调用。然而,它通常被称为。这可能是因为您没有正确地释

我试图对我的一些Java代码进行检测,以确保正确地对对象进行垃圾收集,但令人惊讶的是,它并没有像我预期的那样频繁地被调用

我现在想知道这是否是因为错误的仪器或我需要解决的实际内存泄漏。VisualVM探查器似乎指出了前者

令人担忧的是,我有一个线程处理请求,在请求中创建了数千个临时对象。有时,该线程写入的套接字意外关闭,线程遇到异常并死亡


当线程终止时,这些对象似乎从未调用过.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()
,则存在内存泄漏”。这可能只是因为该对象尚未被垃圾收集

如果要查找内存泄漏,请使用工具。见选项:


您是否有一个简单的、自包含的示例来显示这种行为?@aix:是的,当然,他遇到了涉及数千个对象、网络访问和意外的套接字关闭的情况。他不知道问题从何而来,顺便说一句,这正是他来这里问问题的原因。。。然而,他应该简单地写一个完整的例子来再现这个问题。老实说,这个“SSCCE议程”起源于Usenet上的comp.lang.java(并且已经被推到这里的人推到了这里),现在已经很累了。。。我是说,说真的,你读过这个问题吗?你写一本复制这本书怎么样?@CedricMartin:冷静点。我认为这是一个合理的问题。如果答案是否定的,那么答案就是否定的。没有理由对任何事情如此激动。