我在java的system.gc()和finalize()方法之间混淆了。 我们不能强制将垃圾对象收集到JVM。我们允许在我们的java代码中编写这两种方法然后如果两者都用于垃圾收集,那么为java提供两种垃圾收集方法有什么意义呢?
请告诉我两种方法的确切工作方式以及内部工作方式?
答案 0 :(得分:11)
System.gc()
请求系统执行垃圾收集。 Javadoc说:
运行垃圾收集器。
你无法控制垃圾收集器的“硬”程度。垃圾收集器如何在内部工作是特定于VM的,并且是一个独立的研究课题。但是通常会有“完整”的垃圾收集和一些较小的“增量”收集。因此,请将System.gc
视为请求,但不保证会对您的对象进行垃圾回收。
Object.finalize()
来指定当给定对象被垃圾收集时要做什么(实际上在垃圾收集之前要做什么)。 Javadoc说:
垃圾收集时由垃圾收集器调用对象 确定没有对该对象的更多引用。
终结器的经典用法是在对象被垃圾收集时解除分配系统资源,例如,发布文件句柄,临时文件等。
当JVM退出时,不要使用终结器来执行操作。为此,请使用您在Runtime.getRuntime().addShutdownHook(Thread)
注册的关闭挂钩。
答案 1 :(得分:2)
System.gc()
强制垃圾收集器运行,而对象的Finalize()
方法定义了收集此特定对象时垃圾收集器应该执行的操作。
粗略地说,就像这样:
class MyClass {
public UnmanagedResource resource;
void Finalize() {
FreeUnmanagedResource(resource);
}
}
MyClass[] data = new MyClass[1000];
for(int i=0; i<1000; i++) {
data[i] = new MyClass();
}
//do some work
data = null;
System.gc(); //Note that it doesn't guarantee you that all MyClass instances will be actually collected at this point.
答案 2 :(得分:1)
system.gc()
方法通知JVM垃圾收集器现在可以通过删除未使用的对象来清除内存。根据java doc:
调用gc方法表明Java虚拟机花费了大量精力来回收未使用的对象,以使其当前占用的内存可用于快速重用。当控制从方法调用返回时,Java虚拟机已尽最大努力从所有丢弃的对象中回收空间。
finalize()
方法不会触发垃圾收集器,而是会在垃圾收集器中调用它来销毁对象。它提供了正确清除对象的说明。
答案 3 :(得分:1)
System.gc()方法垃圾收集由new关键字创建的对象,而当我们想要垃圾收集非使用new关键字创建的对象时,使用finalize()方法。所以,我猜这个答案。你的Q
答案 4 :(得分:0)
垃圾收集用于回收对象的已分配内存,垃圾收集器调用Finalize()
,然后回收主要用于在删除之前执行某些操作的内存Finalize()
方法对象
答案 5 :(得分:0)
有很多类包含finalize()方法,我假设你的意思是Object类中的那个。当您希望Java的垃圾编译器运行时,您可以调用System.gc()。它将每隔几分钟自行运行,但您可以随时要求它运行。当gargabe收集器运行时,它会在没有更多引用的每个对象上调用finalize()方法。基本上,System.gc()清理内存,并使用finalize()来删除单个对象。
答案 6 :(得分:0)
这里的答案很棒,只是想详细说明一下finalize()方法:你永远不应该使用它。 它的执行完全没有保证,最终使用finalize()会增加性能损失。
正如Joshua Bloch在Effective Java中所写:
终结器是不可预测的,通常是危险的 不必要。永远不要在终结者中做任何时间关键的事情。决不 依赖终结器来更新关键的持久状态。
和
哦,还有一件事:性能损失严重 使用终结器。在我的机器上,创建和销毁的时间 简单对象约为5.6 ns。添加终结器会增加时间 到2,400 ns。换句话说,创建速度慢约430倍 并使用终结器销毁对象。
首选使用以下资源终止try-finally模式,保证运行:
Bar bar = new Bar(...);
try {
// Your code here
} finally {
bar.releaseResource(); // You implementation. For example close connection
}
答案 7 :(得分:0)
通过在任何类上调用System.gc()
方法来调用垃圾收集器。但它并不能保证在jvm关闭之前所有 nullified 对象都将被垃圾收集。所以基本上gc()
方法只是垃圾收集那些使用new关键字创建的对象。对象是由任何其他逻辑创建的,而不是通过在finalize()
调用垃圾收集器之前显式调用gc
方法来进行垃圾收集。