例えば
public void doSomething() {
Dog smallDog = new Dog();
smallDog.bark();
}
このメソッドの実行後に犬オブジェクトが収集されますか?
例えば
public void doSomething() {
Dog smallDog = new Dog();
smallDog.bark();
}
このメソッドの実行後に犬オブジェクトが収集されますか?
メソッドが返されると、収集できるようになります。ガベージ コレクションが実際にいつ行われるかは、未知の未来の時間です。
bark() の実装を見ずして、確実に判断することは不可能です。
これがあなたの樹皮である場合:
public void bark() {
BarkListeners.callBack(this);
}
public class BarkListeners {
private static final List<Dog> barkers = new ArrayList<Dog>();
public static void callBack(Dog dog) {
barkers.add(dog);
}
}
いいえ、ガベージコレクションは行われません!
単にいいえ。つまり、タイミングはそのようである必要はありません。
すべての Java オブジェクトはヒープに割り当てられ、GarbageCollector によって収集されます。また、GarbageCollector はバックグラウンドで実行され、実際のガベージ コレクションをいつ実行するかについての制約はほとんどありません。
の実装を見たことがないため、技術的には、答えを出すことはできませんDog#bark()
。
通常、答えは YES です。Dog
メソッドが実行された後にインスタンスが収集されます。正確なタイミングを知ることはできません。これは、メソッドがオブジェクトへの参照を別のオブジェクトとbark
共有しない限り、の特定のインスタンスに到達できなくなるためです。ガベージ コレクターが次に実行されるときに、到達不能であると判断され、それを保持するために使用されたヒープ領域が収集されます。Dog
Dog
Dog
オブジェクトの到達能力に依存します。オブジェクトに到達できない場合、GC の対象となります。いつ GC を行うかは、JVM の実装によって異なります。真実を知ってくださいガベージ コレクション
このブログ投稿では、ガベージ コレクション プロセスのしくみについて説明しています。要約する:
オブジェクトは、ライブ スレッドまたは静的参照から到達できない場合、ガベージ コレクションの対象になります。これ (ガベージ コレクター) は、JVM が Java ヒープ サイズに基づいてガベージ コレクションが必要であると判断した場合にのみトリガーされます。
したがって、オブジェクトがいつガベージ コレクションされるかを推測するべきではありません。