1

新しいインスタンスfooを作成したいとします。

私はこのようにします:

SomeClass foo = new SomeClass();

ここで、オブジェクトが最後に到達し(たとえば、ゲームで衝突する弾丸のように)、破棄して再初期化する必要があるとします。オブジェクトをリセットするには、次のいずれかを実行できます。

foo = new SomeClass();

またはこれ

foo.reset();

注意:このreset()メソッドは、そのインスタンスからすべての変数をリセットするだけです。

(GCを回避しようとする場合)どちらが良い方法ですか?最初のオプションは新しいポインタを作成しますか?

4

2 に答える 2

2

最初のオプションは、新しいオブジェクトを作成し、古いオブジェクトをガベージとして収集するために残します(他にライブ参照がない場合)。

GCを減らすための1つの戦略は、オブジェクトプールを維持することです。これは、現在使用されておらず、再利用できるオブジェクトのコレクションにすぎません。オブジェクトが完成したら、それをプールに返すメソッドを呼び出します。新しいオブジェクトが必要な場合は、新しいオブジェクトを作成する前にプールをチェックするメソッドを呼び出します。プールが空でない場合は、新しいオブジェクトを作成するのではなく、プールからオブジェクトを削除して再利用します。

public class SomeClass {
    private static final int MAX_POOL_SIZE = . . .;
    private static final ArrayList<SomeClass> pool = new ArrayList<SomeClass>();

    public static SomeClass getInstance() {
        int poolSize = pool.size();
        if (poolSize > 0) {
            return pool.remove(poolSize-1);
        }
        return new SomeClass();
    }

    public void recycle() {
        // reset any fields
        if (pool.size() < MAX_POOL_SIZE) {
            pool.add(this);
        }
    }
    . . .
}

新しいが必要な場合はSomeClass、を呼び出しますSomeClass.getInstance()。インスタンスを使い終わったら、そのrecycle()メソッドを呼び出します。

于 2012-10-30T08:06:47.713 に答える
0

GCを避けたい場合は、2番目のオプションの方が適しています。

実際、最初のオプションを選択した場合でも、JVMはすぐにGCを実行しません。ヒープがいっぱいになると(または作成したばかりのオブジェクトには不十分な場合)、GCが実行されます。最初のインスタンスは新しいインスタンスを作成し、古いオブジェクトへの強い参照はありません。したがって、JVMのヒープがいっぱいになると、JVMはGCを実行し、古いオブジェクトはGCされます。

その上、GCに関するいくつかのコンテンツもあり、リファレンスはあなたが使用したリファレンスの種類です。「Strong、Soft、Weak、Phantom」という名前の4種類の参照があります。2番目のオプションを使用する場合でも、オブジェクト「foo」への参照が強力な参照でない限り、オブジェクト「foo」もGCされる可能性があります。Reference Phantom SoftReference WeakReferenceなどの4つの参照タイプの詳細については、JDKドキュメントを参照してください。

于 2012-10-30T08:22:49.580 に答える