【问题标题】:java finalize method usejava finalize方法的使用
【发布时间】:2013-09-20 05:35:48
【问题描述】:

我的系统出现内存泄漏,我尝试通过尽快释放内存来优化它。

  1. 这是对finalize方法的好用吗?
  2. 我在哪里捕获“Throwable”对象?

    public class OrderSendBulkHandler extends PandaSoapHandler {
    
    // <login,Data>
    private HashMap<String,OrderSendBulkData> followersData = new HashMap<String,OrderSendBulkData>();
    
    // <login,error_code> 
    private HashMap<String,BulkDataResponse> positionResponses = new HashMap<String,BulkDataResponse>();
    
    private Position position;
    
    private Float guruBalance;
    
    private float partialRatio = -1;
    
    private boolean ignorePosition = false;
    
    @Override
    protected void finalize() throws Throwable {
    try {
        followersData.clear();
        followersData = null;
        positionResponses.clear();
        positionResponses = null;
        position = null;
        guruBalance = null;
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    
    super.finalize();
    

    }

    // more code of the class here ...
    // .....
    

    }

【问题讨论】:

  • Java Finalize method call 的可能重复项
  • 不,像这样编写finalize() 方法不是一个好主意。不要这样做,而是使用分析器找出导致内存泄漏的原因,然后解决问题。
  • 不要尝试优化,而是修复内存泄漏!

标签: java garbage-collection


【解决方案1】:

Finalize 不是做任何与内存泄漏相关的代码优化的地方。

事实上,经验法则是“永远不要将 finalize 用于您的程序逻辑/成功所依赖的任何事情”。

【讨论】:

    【解决方案2】:

    Is this a good use of the finalize method?
    不。因为这里你使对象有资格在 finalize() 中进行垃圾收集。
    但是根据java docs

    finalize() 方法 当垃圾收集器确定不再有对该对象的引用时,由垃圾收集器对该对象调用。

    因此,您可以改用finally 块来使对象符合垃圾回收条件。
    这些是值得一读的 SO 问题
    1.In Java, what purpose do the keywords `final`, `finally` and `finalize` fulfil?
    2.Clean up code in finalize() or finally()?

    【讨论】:

      【解决方案3】:

      没有。您的 finalize() 方法完全没有默认情况下不会发生的相关操作。

      【讨论】:

      • 但在清理对象的速度方面可能会变得更糟。
      【解决方案4】:

      使用 finalize() 方法实际上减慢内存的释放。使用 finalize 时,必须将对象添加到队列中,因此在另一个线程中调用它之前不会对其进行清理,这意味着将其实际清理延迟至少一个 GC 周期。

      如果你不使用 finalize() 可以在一个周期内清理它,这也包括对象引用的任何内容。

      减少内存消耗的最佳方法是使用内存分析器。我会通过创建更少的垃圾来减少 GC 的负载,并通过查看堆的分解来减少保留的内存量,尤其是查看对象的分配位置。

      如果您没有商业分析器,我建议在 Java 7 更新 40 中支持 Java Mission Control。

      【讨论】:

      • finalize()的准确描述!!
      【解决方案5】:
      1. 不,不是,JVM 擅长遍历对象图并移除未使用的对象。实现自己的 finalize 方法只会降低性能。
      2. 你不必

      您应该使用以下策略来跟踪内存泄漏:

      1. 将以下属性添加到您的应用程序 -XX:+HeapDumpOnOutOfMemoryError(假设您使用的是 HotSpot JVM)
      2. 使用某种类型的测试加载您的应用程序,这样您最终会得到 OutOfMemoryError - 之后您可以在 app 目录中找到一个 .hprof 文件
      3. 下载http://www.eclipse.org/mat/
      4. 在 MAT 工具中打开 .hprof 文件,打开 Dominators 树并尝试查找问题的根本原因

      【讨论】:

        猜你喜欢
        • 2011-06-05
        • 2011-07-07
        • 2016-06-10
        • 2011-03-19
        • 2015-03-13
        • 2011-08-17
        • 2018-12-03
        • 2018-01-01
        相关资源
        最近更新 更多