1

私は現在、オンライン ゲーム用の小さなサーバーを作成しています。接続とデータ転送を処理する 1 つの「サーバー」オブジェクトと、2 人のプレーヤー間で作成されたゲーム セッションごとに 1 つの「ゲーム」オブジェクトを作成します。

「Game」クラスは「Thread」を拡張し、その run() メソッドに無限ループを持ちます。

各「ゲーム」オブジェクトは、他のいくつかのオブジェクト (ボード上のピースなど) への参照を保持し、これらのオブジェクト自体は、定期的に相互に通信する必要があるため、対応する「ゲーム」オブジェクトへの参照を保持します。 .

さて、ゲームが終了し、「ゲーム」オブジェクトが不要になった場合、「ゲーム」オブジェクトが確実にガベージ コレクションされるようにするには、どのような手順を踏む必要がありますか?

私の考えは次のとおりです。

「サーバー」オブジェクト: 問題のゲーム オブジェクトへの参照を削除します。

問題のゲーム オブジェクトによって使用されるすべてのオブジェクトで、問題のゲーム オブジェクトへの参照を削除 (無効化?) します。

Game オブジェクトの run() メソッドを実行している無限ループを中断します。

これで十分ですか、それとも他に必要な手順がありますか、それともこれらの手順のいくつかは必要ありませんか?

4

3 に答える 3

2

これで十分です:

「サーバー」オブジェクト: 問題のゲーム オブジェクトへの参照を削除します。

ゲームがアプリケーションのルートから参照されていない場合、ガベージ コレクションが行われる可能性があり、ゲームが参照したすべてのオブジェクトも同様に収集されます (ゲームが参照されたかどうかは問題ではありません。どこからでもアクセス可能)。

于 2013-11-06T21:04:59.177 に答える
0

ゲームが終了し、「ゲーム」オブジェクトが不要になった場合、「ゲーム」オブジェクトが確実にガベージ コレクションされるようにするには、どのような手順を踏む必要がありますか?

そのため、アプリケーションが実際に問題のオブジェクトへの参照を持っていない場合、ガベージ コレクターはそれらを解放します。Gameスレッドが終了する必要がある (つまり、メソッドrun()が戻る必要がある) ため、Threadリープされます。次に、オブジェクトによって支援されるすべてのオブジェクトGameは、参照カウンターが減分され、解放できるようになります。

そうは言っても、オブジェクトの帯域幅が大量にある場合は、オブジェクトのフィールドをGamenull に設定して、所有権オブジェクトの参照を具体的に削除することで、GC を支援できます。これは特に、多くの古いモバイル デバイスがシングル コアであるため、GC 期間の影響を受けやすい Android アプリケーションなどに当てはまります。

ただし、フィールドを明示的に null に設定する必要があるのは、ガベージ コレクターが遅れており、オブジェクトをタイムリーに取得できないと思われる場合のみです。これはややまれです。

于 2013-11-06T21:04:48.440 に答える