为什么最终没有被调用?

2024-02-20

我有几个关于java中的垃圾收集器的问题。

Q1.据我了解,当对象超出范围并且 JVM 即将收集垃圾时,finalize() 就会被调用。我认为 Finalize() 方法是由垃圾收集器自动调用的,但在这种情况下它似乎不起作用。解释是什么?为什么需要显式调用 Finalize() 方法?

public class MultipleConstruct {
    int x,y;    
    public MultipleConstruct(int x)
    {
        this.x= x;
        y=5;        
        System.out.println("ONE");
    }

    @Override
    protected void finalize() throws Throwable {
        // TODO Auto-generated method stub
        super.finalize();
        System.out.println("FINALIZED");
    }
    public static void main(String[] args) throws Throwable {
        MultipleConstruct construct = new MultipleConstruct(3);
    }
}

Q2。另外,什么时候调用垃圾收集器?我知道 gc 是一个守护线程,由 JVM 根据剩余的堆大小调用。这是否意味着,JVM 等待程序使用资源阈值限制,然后通知 gc 清理垃圾对象。

EDIT:gc如何解决循环引用?


Finalize() 方法有很多东西要写,坦率地说有很多东西要写,但简而言之:

如果对象在运行其 Finalize 方法(如果有)后仍然无法访问,则该对象处于 Finalized 状态。最终确定的对象正在等待释放。请注意,VM 实现控制终结器的运行时间。自己进行清理几乎总是比依赖终结器更好。使用终结器还可能留下在不确定的时间内无法恢复的关键资源。

在您的情况下,它不打印的原因是您不知道终结器线程何时调用 Finalize() 方法。发生的情况是程序在打印任何内容之前就终止了。要检查它: 编辑主代码中的代码(注意:这不能保证也不应该依赖它,但它仍然会打印一些时间)

for(int i =0;i<1000000;i++)
    {
        MultipleConstruct construct = new MultipleConstruct(3);
        construct = null;
    }

使用 Finalize() 有很多缺点,从花费更多时间来构造对象到可能出现内存泄漏和内存不足。如果您在 Finalize() 中强烈引用同一个对象,那么它永远不会被第二次调用,因此可能会使系统处于不期望的状态等等...... 唯一应该使用 Finalize() 的地方是作为安全网来处理任何资源,例如 InputStream 使用它来关闭(同样不能保证当您的程序仍然存在时它将运行)。另一个使用它的地方是在使用垃圾收集器无法控制的本机时。

欲了解更多信息,请访问:

http://jatinpuri.com/?p=106 http://jatinpuri.com/?p=106

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么最终没有被调用? 的相关文章

随机推荐

  • 如何从 url 列表创建 Dask DataFrame?

    我有一个 URL 列表 我很想将它们读取到 dask 数据框中 立刻 但看起来像read csv不能使用星号http 有什么办法可以实现这一点吗 这是一个例子 link http web mta info developers data d
  • 设计和单元测试跨平台应用程序

    我正在开发一个为 Windows 构建的项目 当前 并将在未来为 darwin 构建 以下是一个快速概述 文件1 go package management type Manager interface Action1 file2 wind
  • 将 NaN 移至各自行的末尾

    我有一个像这样的数据框 0 1 2 0 0 0 1 0 2 0 1 NaN 1 0 2 0 2 NaN NaN 2 0 我想要得到的是 Out 116 0 1 2 0 0 0 1 0 2 0 1 1 0 2 0 NaN 2 2 0 NaN
  • 只有 NSMutableArray 的第一个对象存储在 NSUserDefaults 中

    我正在尝试存储 UILocalNotification 队列来解决极限问题 https stackoverflow com questions 14689661 cordova ios limit for local notificatio
  • Ruby/Rails 中的“Ago”日期/时间函数

    我想知道 Rails 中是否有一种方法可以计算时间戳 例如半分钟前 2 分钟前 1 天前等 类似于 twitter 实时日期戳的东西 我想知道 Ruby Rails 是否有用于此类日期时间转换的内置函数 您可以使用 10 minutes a
  • bitbake中SRC_URI和FILESEXTRAPATHS_prepend的区别

    为什么我们需要给出文件路径SRC URI即使我们将文件路径包含在FILESEXTRAPATHS prepend多变的 例如 SUMMARY Simple Hello application LICENSE MIT LIC FILES CHK
  • hashmap键集自动排序

    HashMap
  • 为什么 -compile(export_all) 是不好的做法?

    所有的erlang书籍似乎都说export all是不好的做法 但没有给出理由 最后 大多数模块将大部分时间都花在了compile export all 上 因为不断更新模块列表以删除辅助函数是很麻烦的 这是不好的做法吗 因为我应该关心我向
  • 如何既保存两台相机的数据又不影响其拍照速度?

    我正在使用多光谱相机来收集数据 一种是近红外光 另一种是彩色光 不是两台相机 而是一台相机可以同时获取两种不同类型的图像 我可以使用一些 API 函数 例如 J Image OpenStream 两部分核心代码如下所示 一个用于打开两个流
  • PostgresQL SQL:将结果转换为数组

    查询如下 SELECT i adgroup id i category id FROM adgroupcategories br WHERE i adgroup id IN SELECT i adgroup id FROM adgroupu
  • 将数据帧写入 postgres 数据库

    我想将 pandas 数据帧写入 postgres 表 我按如下方式连接到数据库 import psycopg2 import pandas as pd import sqlalchemy def connect user password
  • React 模块解析失败:意外的标记 (1:48)

    有人能帮我吗 我只是创建反应应用程序 然后立即启动它 然后我收到了类似这样的错误 我对 webpack 不太了解 CMD src index js 1 48 Module parse failed Unexpected token 1 48
  • 重置 Keras 层中的权重

    我想重置 随机化 Keras 深度学习 模型中所有层的权重 原因是我希望能够使用不同的数据分割多次训练模型 而不必每次都进行 缓慢的 模型重新编译 灵感来自这次讨论 https github com fchollet keras pull
  • UNIX 中“./”和“sh”的区别

    有时我发现很少有脚本是通过 sh 命令执行的 有时是通过 命令执行的 我无法理解它们之间的确切区别 请帮助我 sh file在新的 shell 进程中执行 shell 脚本文件 file在当前 shell 进程中执行 shell 脚本文件
  • 命令行终端上的乘法

    我正在使用串行终端为我们的实验室实验提供输入 我发现使用 echo 5X5 只返回一个字符串 5X5 有没有执行乘法运算的命令 是的 您可以使用bash 的内置算术扩展 https www gnu org software bash man
  • 如何解决“不支持关键字:‘元数据’”?

    我无法连接到 SQL Server 我的项目的连接字符串是
  • 使用图权重提升深度优先访问者最小生成树

    我想从具有边权重的顶点创建最小生成树 并以深度优先顺序遍历图 我可以构建图表和最小生成树 但我无法编写自定义访问者 include
  • WinHttpSendRequest 失败并显示 ERROR_WINHTTP_SECURE_FAILURE

    以编程方式与网络进行通信不是我的专业领域 但我设法通过从网上找到的示例中剪切和粘贴代码来创建 read web page 函数 并且该代码已经连续好几个月每天正常运行 碰巧的是 我工作时的主 Windows 10 电脑坏了 在等待维修时 我
  • PHP - 读取和修复大型无效 XML 文件

    我必须读取一些相当重的 XML 文件 200 MB 到 1 GB 之间 其中一些文件是无效的 让我举一个小例子
  • 为什么最终没有被调用?

    我有几个关于java中的垃圾收集器的问题 Q1 据我了解 当对象超出范围并且 JVM 即将收集垃圾时 finalize 就会被调用 我认为 Finalize 方法是由垃圾收集器自动调用的 但在这种情况下它似乎不起作用 解释是什么 为什么需要