オブジェクトで実行中のスレッドは、Javaでガベージコレクションされるのを防ぎますか?

暴力をつぶす:

コードを考える:

 new Thread(new BackgroundWorker()).start();

直感的には、BackgroundWorkerインスタンスはスレッドが終了するまでGCから安全であるように見えますが、これは事実ですか?なぜ ?

編集:

この熱はすべて、基本的に同じ投稿で少なくとも2つの異なる質問をすることによって生成されます。タイトルの質問には1つの答えがあります。コードサンプルは異なる方向に進みます-インライン化に応じて2つの可能な結果があります。

投稿された回答は本当に素晴らしいです。Software Monkeyに緑色のチェックボックスを授与します。Darronの回答も同様に有効ですが、Software Monkeyがが抱えていた問題説明していること注意してくださいそれは私のために働いた答えでした。

これを思い出深いものにしてくれてありがとう;)

ローレンスドル:

はい、GCはどのスレッドからも到達できないオブジェクトのみを収集でき、Threadはその実行可能オブジェクトへの参照を保持する必要があるため(またはそれを呼び出すことができないため)。つまり、スレッドの実行中にRunnableオブジェクトに到達できることは明らかです。

実行必要なセマンティクスに関係なく、この新しいスレッドまたは他のスレッドが到達できなくなるまで、オブジェクトはGCされません。これは、少なくともRunnableのrun()を呼び出すのに十分な長さであり、そのスレッドがRunnableインスタンスに到達できる場合は、スレッドの存続期間全体にわたって、JVM仕様によって構成が安全であることが保証されます。


編集:ダロンはこれを打ち負かしており、一部は彼の議論に確信しているように見えるので、私は彼の説明に基づいて、私の説明をさらに詳しく説明します。

今のところ、Thread以外の人がThread.run()を呼び出すことが合法ではないと仮定します。

その場合、Thread.run()のデフォルト実装は次のようになります。

void run() {
    Runnable tmp = this.myRunnable;  // Assume JIT make this a register variable.
    this.myRunnable = null;          // Release for GC.
    if(tmp != null) {
        tmp.run();         // If the code inside tmp.run() overwrites the register, GC can occur.
        }
    }

この場合、tmpは依然としてThread.run()内で実行されているスレッドが到達可能なランナブルへの参照であるため、GCの対象にはなりません。

(不可解な理由により)コードが次のようになった場合:

void run() {
    Runnable tmp = this.myRunnable;  // Assume JIT make this a register variable.
    this.myRunnable = null;          // Release for GC.
    if(tmp != null) {
        tmp.run();         // If the code inside tmp.run() overwrites the register, GC can occur.
        System.out.println("Executed runnable: "+tmp.hashCode());
        }
    }

明らかに、tmp.run()の実行中に、tmpによって参照されるインスタンスをGCすることはできません。

Darronは、到達可能とは、実行中のスレッドから見える参照として定義されているのではなく、すべてのThreadインスタンスから始まるインスタンス参照をルートとして追跡することによって見つかる参照のみを意味すると誤って信じていると思います。どちらか、または私は反対を信じていると誤解されています。

さらに、DarronはJITコンパイラーが好きな変更を行うと想定できます。コンパイラーは実行中のコードの参照セマンティクスを変更することできません到達可能な参照を持つコードを記述した場合、コンパイラーはその参照を最適化できず、その参照がスコープ内にある間にオブジェクトが収集されます。

到達可能なオブジェクトが実際にどのように見つかるかの詳細はわかりません。私は私が保持しなければならないと思う論理を推定しているだけです。私の推論が正しくなかった場合、メソッド内でインスタンス化され、そのメソッドのローカル変数にのみ割り当てられたオブジェクトは、すぐにGCに適格になります。

さらに、全体の議論は議論の余地があります。到達可能な唯一の参照がThread.run()メソッドにある場合、ランナブルのrunはそのインスタンスを参照せず、インスタンスへの他の参照が存在しないため、run()メソッドに暗黙的にthisが渡されます(バイトコードではなく、宣言された引数として)、オブジェクトインスタンスが収集されるかどうかは問題ではありません暗黙的にこれが最適化されている場合、コードを実行する必要がないため、定義により、害を及ぼすことはありませんその場合、Darronが正しい場合でも、最終的な実際の結果は、OPによって想定される構成が完全に安全であるということです。どちらにしても。それは問題ではありません。はっきりさせておきますが、もう一度繰り返します。最後の分析ではそれは問題ではありません

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

「arguments」オブジェクトは、バインドされていない引数のガベージコレクションを防ぎますか?

分類Dev

デリゲートは、オブジェクトがガベージコレクションされるのを防ぐことができますか?

分類Dev

「のための」Javaの文の実装では、ガベージコレクションを防ぎます

分類Dev

Java-メソッドを実行しているオブジェクトをガベージコレクションできますか?

分類Dev

Java ガベージ コレクションがバッチで実行されるのはなぜですか?

分類Dev

Javaでガベージコレクションされたオブジェクトを確認する方法は?

分類Dev

Javaでガベージコレクションされたオブジェクトを確認する方法は?

分類Dev

リストでremove(int index)メソッドを実行してオブジェクトインスタンスを削除すると、ガベージコレクションが呼び出されますか?

分類Dev

ガベージコレクションされたオブジェクトの統計を取得するにはどうすればよいですか?

分類Dev

PHPガベージコレクション:このオブジェクトがまだ参照されているのはなぜですか

分類Dev

構造体内のフィールドへの外部参照は、その構造がガベージコレクションされるのを防ぎますか?

分類Dev

StringオブジェクトはJavaでどのようにガベージコレクションされますか?

分類Dev

Java-どのオブジェクトがガベージコレクションされていますか?

分類Dev

実際のオブジェクトがガベージコレクションされている場合、WeakHashMapのエントリの値はどのようにしてガベージコレクションされますか?

分類Dev

関数型プログラミングのディープスタックは、JVMでのガベージコレクションを防ぎますか?

分類Dev

非静的メソッドで定義された変数は、オブジェクトとともにガベージコレクションされますか

分類Dev

スレッドローカルマップにthreadlocalオブジェクトへの弱参照が含まれている場合、なぜガベージコレクションされないのですか?

分類Dev

StringBuilderのappendの引数は新しいStringオブジェクトですか?ガベージコレクションされますか?

分類Dev

参照をロードするスレッドとその参照の関数を呼び出すスレッドの間で揮発性参照が変更された場合、古いオブジェクトをガベージコレクションできますか?

分類Dev

Java Streamターミナル操作の実行中にオブジェクトがガベージコレクションされないのはなぜですか?

分類Dev

ガベージコレクションはJavaのオブジェクトアドレスを変更しますか?

分類Dev

コレクション内のオブジェクトに対してさまざまな順序でいくつかのメソッドを実行する

分類Dev

Tomcatセッションでスペースを取りすぎるJavaオブジェクト(レガシーコード)

分類Dev

jsイメージオブジェクトのガベージコレクションが行われないのはなぜですか?

分類Dev

NodeJSでガベージコレクションのオブジェクトを「マーク」する

分類Dev

引数として渡され、メソッドでnullに設定されているオブジェクトのガベージコレクション

分類Dev

オブジェクトがjavascriptでガベージコレクションされる前のクリーンアップ-方法は?

分類Dev

次の文字列オブジェクトのうち、ガベージコレクションの準備ができているのはどれですか?

分類Dev

ガベージコレクションを適切に処理し、カスタムオブジェクトポインタのコレクションを使用してメモリリークを回避するにはどうすればよいですか?

Related 関連記事

  1. 1

    「arguments」オブジェクトは、バインドされていない引数のガベージコレクションを防ぎますか?

  2. 2

    デリゲートは、オブジェクトがガベージコレクションされるのを防ぐことができますか?

  3. 3

    「のための」Javaの文の実装では、ガベージコレクションを防ぎます

  4. 4

    Java-メソッドを実行しているオブジェクトをガベージコレクションできますか?

  5. 5

    Java ガベージ コレクションがバッチで実行されるのはなぜですか?

  6. 6

    Javaでガベージコレクションされたオブジェクトを確認する方法は?

  7. 7

    Javaでガベージコレクションされたオブジェクトを確認する方法は?

  8. 8

    リストでremove(int index)メソッドを実行してオブジェクトインスタンスを削除すると、ガベージコレクションが呼び出されますか?

  9. 9

    ガベージコレクションされたオブジェクトの統計を取得するにはどうすればよいですか?

  10. 10

    PHPガベージコレクション:このオブジェクトがまだ参照されているのはなぜですか

  11. 11

    構造体内のフィールドへの外部参照は、その構造がガベージコレクションされるのを防ぎますか?

  12. 12

    StringオブジェクトはJavaでどのようにガベージコレクションされますか?

  13. 13

    Java-どのオブジェクトがガベージコレクションされていますか?

  14. 14

    実際のオブジェクトがガベージコレクションされている場合、WeakHashMapのエントリの値はどのようにしてガベージコレクションされますか?

  15. 15

    関数型プログラミングのディープスタックは、JVMでのガベージコレクションを防ぎますか?

  16. 16

    非静的メソッドで定義された変数は、オブジェクトとともにガベージコレクションされますか

  17. 17

    スレッドローカルマップにthreadlocalオブジェクトへの弱参照が含まれている場合、なぜガベージコレクションされないのですか?

  18. 18

    StringBuilderのappendの引数は新しいStringオブジェクトですか?ガベージコレクションされますか?

  19. 19

    参照をロードするスレッドとその参照の関数を呼び出すスレッドの間で揮発性参照が変更された場合、古いオブジェクトをガベージコレクションできますか?

  20. 20

    Java Streamターミナル操作の実行中にオブジェクトがガベージコレクションされないのはなぜですか?

  21. 21

    ガベージコレクションはJavaのオブジェクトアドレスを変更しますか?

  22. 22

    コレクション内のオブジェクトに対してさまざまな順序でいくつかのメソッドを実行する

  23. 23

    Tomcatセッションでスペースを取りすぎるJavaオブジェクト(レガシーコード)

  24. 24

    jsイメージオブジェクトのガベージコレクションが行われないのはなぜですか?

  25. 25

    NodeJSでガベージコレクションのオブジェクトを「マーク」する

  26. 26

    引数として渡され、メソッドでnullに設定されているオブジェクトのガベージコレクション

  27. 27

    オブジェクトがjavascriptでガベージコレクションされる前のクリーンアップ-方法は?

  28. 28

    次の文字列オブジェクトのうち、ガベージコレクションの準備ができているのはどれですか?

  29. 29

    ガベージコレクションを適切に処理し、カスタムオブジェクトポインタのコレクションを使用してメモリリークを回避するにはどうすればよいですか?

ホットタグ

アーカイブ