垃圾收集者的疑惑

时间:2012-06-28 06:20:16

标签: java garbage-collection

我在这里有一些关于java垃圾收集器的问题。 首先让我清楚一下我对Java GC.的理解 GC是一个后台线程,它将始终在JVM启动时在后台运行。 每个对象都有一个finalize()方法。这个方法用于释放 在销毁对象之前的系统资源。据java专家介绍, 我们不应该把资源放在finalize()方法下来释放 系统资源。因为我们无法确定GC何时运行。但我们可以 通过致电GC请求System.GC()投放。

所以现在我的问题是,GC是一个后台线程将始终在后台运行。 现在我们怎么能说我们不知道GC什么时候会运行?声明是这样的"we dont know when the GC will call finalize() method " 那是什么意思吗?如果这就是他们的意思,那么工作是什么 GC的? GC有责任找出未使用的变量并从内存中删除。 在这种情况下,为什么GC也不能调用finalize()方法?

2 个答案:

答案 0 :(得分:2)

  

现在我们怎么能说我们不知道GC什么时候会运行?。

GC的功能由复杂的Algos处理,它依赖于底层操作系统和硬件。我们不能说因为如果有人告诉某个特定的JVM版本它对其他JVM无效。所以我们最好不要依赖它。

  

GC的工作是什么。

GC查找引用较少的对象(读取更多类型的引用)并回收它们使用的内存。

  在那种情况下,为什么GC也不能调用finalize()方法呢?

所以肯定会调用finalize方法但是不确定何时。因为即使你在jVM中知道finalize()方法会运行,你也不知道在其他JVM中何时。因此,如果您在finalize方法中处理一些非常昂贵的资源,那么您的程序可能会在其他JVM中崩溃。

答案 1 :(得分:0)

简单地说,GC将在不确定的时间运行,因此如果依赖finalize来释放它们,系统资源将不会及时释放。当大多数程序逻辑应该被设计为在不再使用资源时简单地释放资源时,等待GC收集持有系统资源的对象的堆空间是没有意义的。

有点相关的说明。导致早期版本的JVM速度过慢的问题之一是调用finalize。因此,现代JVM将尽可能跳过调用finalize。因此,依赖finalize也会对性能产生影响。