首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java中的System.gc()和finalize()方法有什么区别?

java中的System.gc()和finalize()方法有什么区别?
EN

Stack Overflow用户
提问于 2012-04-17 14:25:18
回答 8查看 23.8K关注 0票数 15

我混淆了java的system.gc()和finalize()方法。我们不能强制将垃圾对象收集到JVM。我们允许在java代码中编写这两个方法,如果这两个方法都用于垃圾收集,那么通过java提供两个垃圾收集方法又有什么意义呢?

请告诉我这两种方法的确切工作原理和内部工作原理?

EN

回答 8

Stack Overflow用户

发布于 2012-04-17 14:28:20

System.gc()友好地请求系统执行垃圾收集。Javadoc说:

运行垃圾收集器。

您无法控制垃圾收集器将如何“努力”工作。垃圾收集器如何在内部工作是特定于VM的,这本身就是一个研究课题。但通常会有“完整的”垃圾收集和一些较小的“增量”收集正在进行。因此,可以将System.gc看作是一个请求,但是不能保证会发生对象的垃圾回收。

可以重写Object.finalize()来指定当给定对象被垃圾收集时要做什么(实际上是在垃圾收集之前做什么)。Javadoc说:

当垃圾回收确定不再有对对象的引用时,由对象上的垃圾回收器调用的

终结器的典型用法是在对象被垃圾回收时释放系统资源,例如释放文件句柄、临时文件等。

当JVM退出时,不要使用finalizer来执行操作。为此,请使用您向Runtime.getRuntime().addShutdownHook(Thread)注册的关闭钩子。

票数 13
EN

Stack Overflow用户

发布于 2012-04-17 14:28:59

System.gc()强制垃圾收集器运行,而对象的Finalize()方法定义垃圾收集器在收集此特定对象时应该执行的操作。

粗略地说,是这样的:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2012-04-17 14:34:40

system.gc()方法通知JVM垃圾收集器现在可以运行,通过删除未使用的对象来清除内存。根据java文档:

调用gc方法的

建议Java Virtual Machine努力回收未使用的对象,以便使它们当前占用的内存可用于快速重用。当控制从方法调用返回时,Java虚拟机已经尽了最大努力从所有被丢弃的对象中回收空间。

finalize()方法不会触发垃圾回收器,而是在垃圾回收器销毁对象时调用它。它提供了正确清除对象的说明。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10186183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档