次のコードでは
List<SomeObject> someObjectList = new ArrayList<SomeObject>();
do {
SomeObject someObject = new SomeObject();
someObjectList.add(someObject);
} while(some condition is met);
私の質問
- someObjectはいつグラブ収集されますか?
- ここでメモリリークが発生していますか?
次のコードでは
List<SomeObject> someObjectList = new ArrayList<SomeObject>();
do {
SomeObject someObject = new SomeObject();
someObjectList.add(someObject);
} while(some condition is met);
私の質問
someObjectはいつグラブ収集されますか?
someObject 到達できなくなったときにGCされます。提供されている簡単な例では、これは次のいずれかが発生した場合に発生する可能性があります。
someObjectList到達できなくなりましたsomeObjectから削除されsomeObjectListます(したがって、到達できなくなります)ここでメモリリークが発生していますか?
私の知る限り、コードのメモリリークを示すものは何もありません。
someObjectループが終了するまでGCされません。これがメモリリークであるかどうかは、解釈の余地があります。繰り返しながら解放されることを期待している場合は、リークしています。そうでなければ、あなたはそうではありません。
someObjectはローカル変数であり、ガベージコレクションされることはありません。これsomeObjectは、スタックまたはレジスタ内の「何か」です。ローカル変数自体はJavaオブジェクトではありません。
someObjectのインスタンスへの参照を一時的に保持しますSomeObject。そして、その参照は配列リスト内の配列に格納されます。
このインスタンスはSomeObject、他のオブジェクトがそのインスタンスへの参照を保持しなくなった後、しばらくしてガベージコレクションされます。