4

クラス内にメソッドがあり、そのメソッド内にオブジェクトを作成している場合、そのオブジェクトは破棄され、メソッドが終了すると割り当てられたメモリは解放されますか?

例えば。-

public void drawFigure(){

    Paint paint = new Paint();
    paint.setSomeProperty();

    canvas.drawLine(startPoint, finishPoint, paint);

}

メソッド drawFigure が完了すると、ペイント オブジェクトは破棄されますか? これは paint = null と同じですが、ローカル オブジェクトであるため、null に設定する必要はありません。私は正しいですか?

4

6 に答える 6

6

メソッド呼び出しが行われるとすぐにオブジェクトが GC されることは保証されていませんが、オブジェクトは GC の対象となり、次の GC 実行時に収集され、メモリが解放されます。

編集:

はい。それで合っています。に設定する必要はありませんnull。スタック上にローカル変数が作成され、メソッドが完了するとすぐにスタックが削除されます。したがって、ペイントはメモリから離れ、new Paint()オブジェクトは参照なしでヒープ上にあるため、上記のオブジェクトが GC の対象になります。

スタンフォード教授によるこのyoutube ビデオを参照してください。

于 2013-01-16T06:31:30.253 に答える
4

を使用してオブジェクトを作成することを意味するか、参照を作成することを意味するかによって異なりますnew

public AnObjectType GimmeAnObject(){
    AnObjectType object = new AnObjectType ();
    return object;
}

これは参照を破棄しますobjectが、割り当てられたメモリは関数から返され、戻り値が呼び出しサイトで別の参照に割り当てられていない場合にのみ割り当てが解除されます (GC の対象としてマークされます)。

編集:あなたの例では、paint参照は破棄されます。drawLineメソッドが参照を保持していない場合(可能性は低い)、オブジェクト自体が破棄されたpaintときにガベージ コレクションの対象になります。paint

そうですpaint = null、関数の最後の行として呼び出したのとまったく同じです。

于 2013-01-16T06:32:45.810 に答える
1

オブジェクトへの参照がメソッドをエスケープしない限り (つまり、オブジェクトを返さない、またはオブジェクトを参照するオブジェクトを返さない)。

メモリの解放のタイミングはガベージ コレクタ次第ですが、参照されたオブジェクトはコレクションに使用できます。

于 2013-01-16T06:31:37.567 に答える
1

その作成されたオブジェクトへの参照を返していますか? その場合、そのオブジェクトへのすべての参照を解放した後、ガベージ コレクターの対象になります。そうでない場合は、その関数をステップアウトした直後の GC の対象となる可能性があります。それにもかかわらず、GC はこのオブジェクトをすぐにはクリアしないため、これを制御することはできません。GC がそのようなオブジェクトをいつ破棄するかはわかりません。これらのリソースを解放するのは仮想マシンの問題です。

于 2013-01-16T06:37:23.483 に答える
0

ローカル参照変数 paint が範囲外になると、メモリ内のオブジェクトはそれを参照しなくなります (GC の対象となります)。そのため、このメモリは次の GC 実行サイクルで GC によって収集されます。

于 2013-01-16T07:10:14.537 に答える