【问题标题】:Is it compulsory that finalize() method will be called every time we call System.gc() in java?每次我们在 java 中调用 System.gc() 时都必须调用 finalize() 方法吗?
【发布时间】:2018-10-09 16:06:37
【问题描述】:

每次我们在 Java 中显式调用 System.gc() 时都必须调用 finalize()method 吗?

1. How to Handle Java Finalization's Memory-Retention Issues

我想了解上面的链接

2. 我知道每次我们明确调用 System.gc() 时都不会调用 finalize(),但是现在的问题是为什么有时会调用它而有时不会调用它?我想我现在让我的问题更有价值了。

【问题讨论】:

  • 不能保证在垃圾回收时调用终结。
  • System.gc() 不保证 GC 会开始收集垃圾对象。因此答案是否定的。您也可以结帐This discussion
  • 试过那个叫做“先前研究”的东西吗?
  • 我已将问题作为副本关闭,并为您添加了一些关于 System.gc()finalize() 的有用链接。如果你觉得你问的不是重复的,请添加一个你想要理解的解释。然后我们将重新打开问题。
  • @Andrew : 我想了解 Finalization 的内存保留问题

标签: java garbage-collection


【解决方案1】:

在这个例子中,finalize method() 可能会被调用,也可能不会被调用。它完全取决于何时调用 finalize 方法的 JVM。如果你运行这个程序,有时你会得到输出,有时不会。(-,-) 所以试试你的运气

class Person{  
public int a;
public void finalize(){
    //System.out.println("finalize called"+this.hashCode());
    System.out.println("finalize called"+this.a);
}  
public static void main(String[] args){  
    Person f1=new Person();  
    f1.a=10;
    Person f2=new Person();  
    f1=null;  
    f2=null;  
    System.gc();  
}}

【讨论】:

  • 怎么样...如何处理 Java 终结的内存保留问题?请建议
【解决方案2】:

没有。

System.gc

调用 gc 方法建议 Java 虚拟机 努力回收未使用的物品,以使 它们当前占用的内存可用于快速重用。

finalize

finalize 方法永远不会被 Java 虚拟多次调用 任何给定对象的机器。

【讨论】:

    【解决方案3】:

    没有。不能保证 GC 会永远发生,更不用说响应 System.gc(),更不用说最终会运行终结器。

    现在的问题是为什么有时会被调用而有时不会发生这种情况

    因为System.gc() 的结果可能会导致 GC 和 finalization 运行:没有什么可以阻止它,所以它会发生,如果没有,则不会,因为没有保证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-27
      • 2016-11-04
      • 1970-01-01
      • 2020-09-11
      • 2020-07-15
      相关资源
      最近更新 更多