1

My system suffer from memory leak, i try to optimize it by releasing memory as soon as possible.

  1. Is this a good use of the finalize method?
  2. Where to i catch the "Throwable" object?

    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 ...
    // .....
    

    }

4

5 回答 5

4

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

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

于 2013-09-16T06:45:35.767 回答
2

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

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

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

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

于 2013-09-16T06:51:06.340 回答
1

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

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

因此,您可以使用finallyblock 来使对象符合垃圾回收的条件。
这些是值得一读的 SO 问题
1.在 Java 中,关键字 `final`、`finally` 和 `finalize` 有什么用途?
2.清理finalize() 或finally() 中的代码?

于 2013-09-16T06:46:04.973 回答
1
  1. 不,不是,JVM 擅长遍历对象图并删除未使用的对象。实现自己的 finalize 方法只会降低性能。
  2. 你不必

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

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

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

于 2013-09-16T06:48:17.850 回答