1

次のように書くと: { new A().test(); A のメモリは、この関数が返された後に gc によって収集されます (収集できることはわかっていましたが、現在は収集されていません)。問題は、jvm が test() の実行中に A のメモリが認識されないようにする方法です (gc は独立したスレッドであると想定しています)。コンパイラがステートメントを次のように変更する可能性があると思いました。

{
    //cover it in a scope
    {
    A temp = new A();
    temp.test();
    }
    //outside the scope, temp is no longer stay in stack, so that A's memory can be colllected
}

これは単なる推測です。ところで、私の下手な英語で申し訳ありません。簡単な構文を使用してください(回答または説明するため)、ありがとう。

4

2 に答える 2

0

コンパイラは、例のように、スタック上の A への一時的な参照があることを保証するバイト コードを生成します。

于 2013-01-30T04:14:00.880 に答える
0

gc は、オブジェクトの到達可能性をチェックします。オブジェクトはヒープに割り当てられ、それへの参照は実行中の現在のメソッドのスタックに配置されます。これにより、gc によって到達可能になるため、収集されません。

メソッドがスタックメモリに「到達可能」ではないことを返すと、ヒープ内のオブジェクトへの単一の参照がなくなるため、gc は自由にコレクション用にマークできます。

あなたの「一時」変数は、とにかくコンパイラが作成するその参照のきれいな名前です。

于 2013-01-30T05:29:47.953 に答える