当前位置: 首页 > 面试题库 >

Java和手动执行finalize

鲍建业
2023-03-14
问题内容

如果我finalize()从程序代码中调用一个对象,那么当垃圾回收器处理该对象时, JVM是否 还会再次运行该方法?

这是一个大概的例子:

MyObject m = new MyObject();

m.finalize();

m = null;

System.gc()

是否要显式调用以finalize()使 JVM 的垃圾回收器不对finalize()对象运行该方法m


问题答案:

根据这个简单的测试程序,即使您显式调用了JVM,JVM仍将对finalize()进行调用:

private static class Blah
{
  public void finalize() { System.out.println("finalizing!"); }
}

private static void f() throws Throwable
{
   Blah blah = new Blah();
   blah.finalize();
}

public static void main(String[] args) throws Throwable
{
    System.out.println("start");
    f();
    System.gc();
    System.out.println("done");
}

输出为:

开始
定案!
定案!
完成


那里的每个资源都说永远不要显式地调用finalize(),甚至几乎永远都不会实现该方法,因为无法保证何时以及何时调用它。最好只手动关闭所有资源。



 类似资料:
  • 我正在调试我的web应用程序,我有一个POST请求。(使用ajax,使用xhrfields:{withcredentials:true})。dataType是'application/json',我的服务器是tomcat,我手动将我的“Access-Control-Allog-Origin”标头设置为“http://localhost:8080”。 跨源请求被阻止:同一源策略不允许读取http:/

  • 在我正在进行的理解DNS的实验中,我试图理解名称服务器如何进行递归查询。我得到了基本的想法-你从一个顶级dns服务器开始,然后它向你发送一个要联系的权威名称服务器列表,然后你联系这些服务器,等等,直到你得到一个权威的响应。 听起来很简单。 但当我在实践中尝试时,我在第一步后就卡住了。我只是使用命令行工具手动执行此操作-(我确保关闭递归) 好的,那么第1步:从根名称服务器开始。我从维基百科的根名称服

  • 问题内容: 如果您曾经参与过Salesforce项目的部署或为SF项目设置持续集成,那么您应该知道,在部署元数据组件(类,页面等)之后,您通常还需要执行一些手动任务,例如填充自定义设置值或设置配置文件的字段级安全性。有很多这样无聊的动作。 在我当前的项目中,我再次面对它,我正在寻找如何最大程度地自动化它的方法。为了将项目部署到Org,我们使用Jenkins + Git。因此,我希望例如在每次部署后

  • 根据我的理解,如果Java解释器单独开始逐行执行字节码,那么性能将很慢,因此JIT将出现在代码优化中,以加快代码的执行。 JIT编译器优化代码,java解释器逐行翻译优化的代码。由于JIT只在运行时运行,所以我们不会得到任何二进制输出。一旦解释器翻译,就会产生二进制代码。 ---现在我的问题是,JIT和JAVA解释器一起工作吗?或者,jit编译器首先工作,然后java解释器开始工作? 请确认这一点

  • 我有一个Kafka侦听器,它实现了具有以下属性的确认消息侦听器接口: 确认模式-手动_立即 IDLEEVENTERVAL-3分钟 在监听器上使用消息时,它决定是否通过acknowledgment.acknowledge()来获取特定记录,并按预期工作。 此外,我还有一个场景,在X分钟后确认最后一个偏移量(将其保留在内存中)(如果没有消息到达)。为了克服这个要求,我决定使用ListenerConta

  • FTP的vb代码非常简单: 有人知道这是脚本任务的问题还是sql代理的问题吗?