Java 垃圾收集器质疑

Java 垃圾收集器质疑,java,garbage-collection,Java,Garbage Collection,我这里有一些关于java垃圾收集器的问题。 首先让我澄清一下我对javagc的理解。 GC是一个后台线程,当JVM启动时,它将始终在后台运行。 每个对象都有一个finalize()方法。此方法用于释放 销毁对象之前的系统资源。java专家表示, 我们不应该将资源放在finalize()方法下以释放 系统资源。因为我们无法确定GC何时运行。但我们可以 通过调用System.GC()请求运行GC 现在我的问题是,GC是一个后台线程,它总是在后台运行。 现在我们怎么能说我们不知道GC何时运行?语句如下

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

现在我的问题是,
GC
是一个后台线程,它总是在后台运行。 现在我们怎么能说我们不知道
GC
何时运行?语句如下所示:“我们不知道GC何时调用finalize()方法” 这就是这个意思吗?如果这就是他们的意思,那工作是什么 GC的
GC
GC
负责找出未使用的变量并从内存中删除。
在这种情况下,为什么
GC
也不能调用finalize()方法?

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

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

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

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

GC的工作是什么

GC查找引用较少的对象(读取类型为ref.for more)并回收它们使用的内存

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


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

我们是否可以确保不再需要一个对象,它将从内存中释放出来?在这种情况下,为什么不能调用finalize()方法并释放系统资源呢?它可以。依赖于要调用的
finalize
是有效的,但不是通常所做的。您可以阅读规范,第12.6章-我们是否可以确保不再需要一个对象,将从内存中释放?在这种情况下,为什么不能调用finalize()方法并释放系统资源?您不能确定。您只能通过将其呈现为ref less使其仅符合GC的条件。将调用finalize()方法,但您不确定何时调用-1,因为JVM规范对自动存储管理(即垃圾收集器)设置了条件。JLS和JVM规范是为了确保Java的跨平台特性而编写的,只是因为平台的模糊性从来都不是一个问题。我说的不是模棱两可,而是他们跨平台行为的一致性。而且,即使对于单个平台,我们也有不同的JVM实现