java finalize方法使用

时间:2013-09-16 06:39:13

标签: java garbage-collection

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

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

    }

5 个答案:

答案 0 :(得分:4)

对于内存泄漏的代码优化,Finalize不是做任何事情的地方。

事实上,拇指规则是“永远不要对你的程序逻辑/成功所依赖的任何东西使用finalize”。

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

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 :(得分:1)

  1. 不,不是,JVM擅长遍历对象图并删除未使用的对象。实现自己的finalize方法只会降低性能。
  2. 你不必
  3. 您应该使用以下策略来跟踪内存泄漏:

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

答案 4 :(得分:0)

没有。你的finalize()方法完全没有任何相关的功能,默认情况下不会发生。