在他的評論中放置該代碼在回答這個問題的@Lin馬:
class SomeClass{
private static List<Object> memoryLeakCulprit = new ArrayList<Object>();
void someMethod(Object obj){
//adding the reference of some object in the culprit list
memoryLeakCulprit.add(obj);
}
//supposed to remove the reference passed
void someOtherMethod(Object obj){
obj = null;
//bummer forgot to remove the reference from list
//now the instance is not reachable by obj
//so now as new references are added to culprit list the memory will keep on increasing in size
}
}
UDPATE
如何解決此泄漏
oid someOtherMethod(Object obj){
//before setting the obj reference to null it must be removed from culprit list
memoryLeakCulprit.remove(obj);
//now its safe to set this reference to null
obj = null;
}
只有這樣,才能解決泄漏到配置文件使用一些性能分析工具的應用程序,如JProfiler,VisualVM並找出哪些類導致泄漏。
當您找到課程該代碼將需要更改,這是唯一的方法。
還有在程序退出之前不需要釋放引用。原因是static
變量(memoryLeakCulprit
)綁定到類對象,並且只要您退出程序,所有引用都會自動釋放,包括類對象。
關於其他說明,請務必在退出程序之前關閉系統資源(套接字,數據庫連接)。
是你的記憶顯示持續增加?你使用任何靜態地圖或其他東西? –
嗨@Narendra,我想搞清楚GC的一些基本知識,因爲我可能需要調整寫入重度應用程序。 –
好的。因爲內存泄漏導致老一代的不斷增加。這就是爲什麼這樣的問題 –