次のコードでは
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
、他のオブジェクトがそのインスタンスへの参照を保持しなくなった後、しばらくしてガベージコレクションされます。