這是一個非常快速和臨時的錯誤修復。 它的工作,但我想找到一個更好的理解和解決方案。我已經「修復」了內存泄漏,但是..如何以更好的方式修復它?
這是類的構造函數產生泄漏
final transient DataInputStream din;
final transient DataOutputStream dout;
final transient BufferedReader bin;
final transient BufferedWriter bout;
NData(Socket sock0) throws IOException
{
sock=sock0;
din= new DataInputStream(sock.getInputStream());
dout = new DataOutputStream(sock.getOutputStream());
bin = new BufferedReader(new InputStreamReader(din));
bout = new BufferedWriter(new OutputStreamWriter(dout));
// ..
}
的bug修復是爲了改變它(除去最後),以便讓我來分配無效後
transient DataInputStream din;
transient DataOutputStream dout;
transient BufferedReader bin;
transient BufferedWriter bout;
NData(Socket sock0) throws IOException
{
sock=sock0;
din= new DataInputStream(sock.getInputStream());
dout = new DataOutputStream(sock.getOutputStream());
bin = new BufferedReader(new InputStreamReader(din));
bout = new BufferedWriter(new OutputStreamWriter(dout));
// ..
}
//And to add a "magic" destructor
void nuller() {
din=null;
dout=null;
bin=null;
bout=null;
}
有一個結束方法結束線程,關閉流,所以我添加了「nuller」方法調用,並且內存泄漏消失了。
爲什麼在完成線程並關閉流之後,它會一直在「byte []」中分配內存? GC爲什麼不把它扔掉? (除了空asignment髒後)
編輯:
卡薩布蘭卡說也許NDATA對象仍然存在, 有一個
final static ConcurrentHashMap <String,NData>();
得有NDATA作爲值,刪除(鍵)完成從地圖清除對象,但..這似乎還不夠。
從HashMap中移除唯一的對象引用不足以移除該對象嗎?
我改變了標題,讓更多的人可以理解你的問題。 Si quieres lo dejas como lo tenias。 :P – 2010-08-04 18:57:32
@Sergio,我不想要「最好」的方式,只想知道更好的方法 – 2010-08-04 19:05:11
垃圾收集器吸。 – someguy 2010-08-04 20:05:48