我的系统遭遇内存泄漏,我尝试通过尽快释放内存来优化它。
我在哪里捕获“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 ...
// .....
}
答案 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)
您应该使用以下策略来跟踪内存泄漏:
答案 4 :(得分:0)
没有。你的finalize()方法完全没有任何相关的功能,默认情况下不会发生。