「見えない」オブジェクトがすぐに収集されないのはなぜですか?

yas4891:

私はこの記事を読みました:ガベージコレクションの真実

「A.3.3非表示」セクションでは、オブジェクトがいつどのようにinvisible状態になるかが説明されています。

以下のコードでは、変数に割り当てられたオブジェクトブロックを出た後fooとなりメソッドが終了するまで強く参照され続けます(ループが永久に実行されるため、これは決して起こりません)。invisibletry/catchrunwhile

public void run() {
    try {
        Object foo = new Object();
        foo.doSomething();
    } catch (Exception e) {
        // whatever
    }
    while (true) { // do stuff } // loop forever
}

それはこの記事で述べられています:

ただし、JVMの効率的な実装では、スコープが外れたときに参照がゼロになることはほとんどありません。

なぜそれが効率的ではないのですか?

私の説明の試みは次のとおりです。

このメソッドのスタックに4つの要素が含まれていて、非表示のオブジェクトが一番下にあるとします。
オブジェクトをすぐに収集したい場合は、3つの要素をポップして保存し、4番目の要素をポップして破棄してから、まだ有効な3つの要素をスタックにプッシュする必要があります。
制御フローがrunメソッドを離れた後で非表示のオブジェクトを収集すると、VMは4つの要素すべてを単純にポップして破棄できます。

悪寒:

ローカル変数はオペランドスタック上ではありませんが、バイトコードによる参照aloadおよびastoreローカル変数のゼロ化の場合にアクセスされる、アクティブ化フレームのローカル変数領域にあります

ゼロ化は必要ないため、非効率的です。

  • すぐにガベージコレクションサイクルが発生しない
  • ゼロは、プログラムのロジックで指定された別の値ですぐに上書きされる可能性があります。
  • スコープ外になると、ローカル変数はガベージコレクションのルートセットの一部ではなくなります。そのため、範囲外になる直前に保持していた値(ゼロまたは有効な参照)は重要ではありません。とにかく調べられません。

編集:

最後の声明についてのいくつかのコメント。

実際、バイトコードレベルではスコープはなく、ローカル変数スロットはメソッドが戻るまでルートセットの一部のままになる場合があります。もちろん、JVM実装は、ローカル変数スロットが停止している(つまり、メソッドが返すすべての可能なパスが変数にアクセスしないか、ストアである)かどうかを判断でき、それをルートセットの一部とは見なしませんが、決してそうする必要はありません。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

ガベージコレクターが、参照されているように見えるオブジェクトをファイナライザーで収集できるのはなぜですか?

分類Dev

GCがオブジェクトを収集しないのはなぜですか?

分類Dev

触れていないのにオブジェクトが変更されるのはなぜですか?

分類Dev

リストに正しい数のオブジェクトが表示されないのはなぜですか?

分類Dev

オブジェクトが2回破壊されたように見えるのはなぜですか?

分類Dev

GridBagConstraintsがJPanelの中心にあるオブジェクトを収集するのはなぜですか?

分類Dev

Pythonで「AttributeError: 'str'オブジェクトに属性 'append'」が表示されないのはなぜですか?

分類Dev

Pythonで「AttributeError: 'str'オブジェクトに属性 'append'」が表示されないのはなぜですか?

分類Dev

オブジェクトの値が各行に表示されないのはなぜですか?

分類Dev

オブジェクトが次のVCに転送されないのはなぜですか?

分類Dev

xCode-ビューにこのオブジェクトが表示されないのはなぜですか?

分類Dev

QPoligonF オブジェクトが pyqt4 の QGraphicsScene に表示されないのはなぜですか?

分類Dev

オブジェクトが別の配列にプッシュされないのはなぜですか?

分類Dev

Pythonのany / allが見つかったオブジェクトを返さないのはなぜですか?

分類Dev

GridViewオブジェクトがコードに表示されないのはなぜですか?

分類Dev

オブジェクトがJavaFXに表示されないのはなぜですか?

分類Dev

オブジェクトがstd :: setに挿入されないのはなぜですか?

分類Dev

.NETガベージが収集されないのはなぜですか?

分類Dev

indexOfの配列にオブジェクトが見つからないのはなぜですか

分類Dev

C ++オブジェクトが指定された値で破棄されないのはなぜですか?

分類Dev

Thymeleafがオブジェクトを見つけられないのはなぜですか?

分類Dev

オブジェクトへの参照があるのに、GCがオブジェクトを収集するのはなぜですか?

分類Dev

オブジェクトが見つからない場合にflowableがデータを返さないのはなぜですか

分類Dev

「NoneType」オブジェクトに属性がないのはなぜですか?

分類Dev

'list'オブジェクトに属性 'items'がないのはなぜですか?

分類Dev

ResultSetオブジェクトに属性 'find'がないのはなぜですか?

分類Dev

含まれているオブジェクトが最初に破棄されるのはなぜですか?

分類Dev

静的メソッドがオブジェクト指向の優れたプラクティスと見なされないのはなぜですか?

分類Dev

Laravel:hasMany関連オブジェクトが表示するオブジェクトと一緒に送信されないのはなぜですか

Related 関連記事

  1. 1

    ガベージコレクターが、参照されているように見えるオブジェクトをファイナライザーで収集できるのはなぜですか?

  2. 2

    GCがオブジェクトを収集しないのはなぜですか?

  3. 3

    触れていないのにオブジェクトが変更されるのはなぜですか?

  4. 4

    リストに正しい数のオブジェクトが表示されないのはなぜですか?

  5. 5

    オブジェクトが2回破壊されたように見えるのはなぜですか?

  6. 6

    GridBagConstraintsがJPanelの中心にあるオブジェクトを収集するのはなぜですか?

  7. 7

    Pythonで「AttributeError: 'str'オブジェクトに属性 'append'」が表示されないのはなぜですか?

  8. 8

    Pythonで「AttributeError: 'str'オブジェクトに属性 'append'」が表示されないのはなぜですか?

  9. 9

    オブジェクトの値が各行に表示されないのはなぜですか?

  10. 10

    オブジェクトが次のVCに転送されないのはなぜですか?

  11. 11

    xCode-ビューにこのオブジェクトが表示されないのはなぜですか?

  12. 12

    QPoligonF オブジェクトが pyqt4 の QGraphicsScene に表示されないのはなぜですか?

  13. 13

    オブジェクトが別の配列にプッシュされないのはなぜですか?

  14. 14

    Pythonのany / allが見つかったオブジェクトを返さないのはなぜですか?

  15. 15

    GridViewオブジェクトがコードに表示されないのはなぜですか?

  16. 16

    オブジェクトがJavaFXに表示されないのはなぜですか?

  17. 17

    オブジェクトがstd :: setに挿入されないのはなぜですか?

  18. 18

    .NETガベージが収集されないのはなぜですか?

  19. 19

    indexOfの配列にオブジェクトが見つからないのはなぜですか

  20. 20

    C ++オブジェクトが指定された値で破棄されないのはなぜですか?

  21. 21

    Thymeleafがオブジェクトを見つけられないのはなぜですか?

  22. 22

    オブジェクトへの参照があるのに、GCがオブジェクトを収集するのはなぜですか?

  23. 23

    オブジェクトが見つからない場合にflowableがデータを返さないのはなぜですか

  24. 24

    「NoneType」オブジェクトに属性がないのはなぜですか?

  25. 25

    'list'オブジェクトに属性 'items'がないのはなぜですか?

  26. 26

    ResultSetオブジェクトに属性 'find'がないのはなぜですか?

  27. 27

    含まれているオブジェクトが最初に破棄されるのはなぜですか?

  28. 28

    静的メソッドがオブジェクト指向の優れたプラクティスと見なされないのはなぜですか?

  29. 29

    Laravel:hasMany関連オブジェクトが表示するオブジェクトと一緒に送信されないのはなぜですか

ホットタグ

アーカイブ