我混淆了java的system.gc()和finalize()方法。我们不能强制将垃圾对象收集到JVM。我们允许在java代码中编写这两个方法,如果这两个方法都用于垃圾收集,那么通过java提供两个垃圾收集方法又有什么意义呢?
请告诉我这两种方法的确切工作原理和内部工作原理?
发布于 2012-04-17 14:28:20
System.gc()友好地请求系统执行垃圾收集。Javadoc说:
运行垃圾收集器。
您无法控制垃圾收集器将如何“努力”工作。垃圾收集器如何在内部工作是特定于VM的,这本身就是一个研究课题。但通常会有“完整的”垃圾收集和一些较小的“增量”收集正在进行。因此,可以将System.gc看作是一个请求,但是不能保证会发生对象的垃圾回收。
可以重写Object.finalize()来指定当给定对象被垃圾收集时要做什么(实际上是在垃圾收集之前做什么)。Javadoc说:
当垃圾回收确定不再有对对象的引用时,由对象上的垃圾回收器调用的
。
终结器的典型用法是在对象被垃圾回收时释放系统资源,例如释放文件句柄、临时文件等。
当JVM退出时,不要使用finalizer来执行操作。为此,请使用您向Runtime.getRuntime().addShutdownHook(Thread)注册的关闭钩子。
发布于 2012-04-17 14:28:59
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.发布于 2012-04-17 14:34:40
system.gc()方法通知JVM垃圾收集器现在可以运行,通过删除未使用的对象来清除内存。根据java文档:
调用gc方法的
建议Java Virtual Machine努力回收未使用的对象,以便使它们当前占用的内存可用于快速重用。当控制从方法调用返回时,Java虚拟机已经尽了最大努力从所有被丢弃的对象中回收空间。
finalize()方法不会触发垃圾回收器,而是在垃圾回收器销毁对象时调用它。它提供了正确清除对象的说明。
https://stackoverflow.com/questions/10186183
复制相似问题