【发布时间】:2014-03-14 11:37:27
【问题描述】:
我正在阅读有关 Java 的垃圾收集和 finalize() 方法的内容,其中一些疑问引起了我的注意。对不起,如果您认为这些怀疑真的很愚蠢。
我正在阅读文章http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html。在这方面,第 5 点说: '在从内存中删除对象之前,垃圾收集线程调用该对象的 finalize() 方法,并提供执行所需的任何类型清理的机会'。 那么这件事肯定会发生吗?我的意思是在执行垃圾收集器方法之前总是调用 finalize() 方法吗?
垃圾收集器如何知道它需要执行?比如我有一个应用部署在服务器上,那么 GC 什么时候执行呢?它是定期执行,还是在收集一些(比如 1MB)垃圾并执行触发器或其他什么时执行,或者它只是随机的,无法确定何时执行?
由于没有进行垃圾回收,它如何降低我的应用程序的性能?
假设我的堆中有很多垃圾,但没有执行垃圾收集器。如果发生这种情况,那是不是 JVM 的不良行为或缺陷?
我们可以说在 C/C++ 中手动完成的垃圾收集比在 Java 中更好,因为我们作为程序员足够聪明并且知道什么时候需要处理掉“不那么引用” ' 指针?
【问题讨论】:
-
不幸的是,
finalize不会“肯定”发生。它最初的设计方式存在几个错误,使其相当不可靠。 -
一般来说,GC 做得足够好,你根本不需要编写终结器;有 一个 例外:如果您使用需要释放的本机资源。 GC 无法关心它们,因为它不知道它们。
-
系统不会随着“垃圾”的积累而变慢。确实,垃圾占用了空间,但在释放对象之后,C++ 堆中的释放空间也是如此。最多,GC 环境可能需要稍大的工作集。
-
没有“手动垃圾回收”之类的东西。
-
@FredOverflow - 你想在星期三晚上来我们家吗?
标签: java c++ c garbage-collection