@Lin Maのコメントへの質問に答えて、このコードを配置します。
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
オブジェクトにバインドされており、プログラムを終了するとすぐに、クラスオブジェクトを含むすべての参照が自動的に解放されるためです。
まったく別の注意点として、プログラムを終了する前に、必ずシステムリソース(ソケット、DB接続)を閉じてください。