0

我在这里有一些关于 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() 方法?

4

2 回答 2

2

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

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

GC的工作是什么。

GC 找到引用较少的对象(读取类型的 ref. 以获得更多)并回收它们使用的内存。

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

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

于 2012-06-28T06:31:43.150 回答
0

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

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

于 2012-06-28T06:30:49.453 回答