1

実行時に各オブジェクトの一意のコピーを付与するためにシングルトンを使用しています。

Car object1= CarFactory.createCar(id);

ここで、createCarメソッドは次のとおりです。

private static ArrayList<Car> cars= new ArrayList<Car>();

public static synchronized Car createCar(int id){
   Car result= new Car(id);
   int index= cars.indexOf(result);
   if (index==-1){
      cars.add(result);
      return result;
   } else {
      return cars.get(index);
   }
}

問題は、このメソッドでは、「cars」コレクションのために各Carが常に参照を持ち、オブジェクトのメモリが解放されないことです。どうすれば改善できますか?

4

3 に答える 3

2

WeakReferenceリストに入れる前に、を使用してオブジェクトをラップします。例:

private static List<WeakReference<Car>> cars = new ArrayList<WeakReference<Car>>();

public static synchronized Car createCar(int id) {
   WeakReference<Car> result= new WeakReference<Car>(new Car(id));
   int index= cars.indexOf(result);
   if (index==-1){
      cars.add(result);
      return result.get();
   } else {
      return cars.get(index).get();
   }
}

注:これは製品コードではありません。使用する前に、さらにいくつかのセーフガードを構築する必要があります。

于 2012-04-08T19:51:16.707 に答える
1

のリストを保持できると思いますWeakReference。弱参照は、オブジェクトがガベージコレクションされないようにするほど強力ではありません。

元:

    List<WeakReference<Point>> list = new ArrayList<>();
    Point p = new Point();
    list.add(new WeakReference<>(p));
    System.out.println(p);
    System.out.println(list.get(0).get());

    p = null;

    System.gc();
    System.gc();
    System.gc();
    System.gc(); // hopefully the GC collects p by now

    System.out.println(list.get(0).get()); // null!

ただし、多数のを作成していてCar、メモリが実際に問題にならない限り、問題を起こす価値はないでしょう。

于 2012-04-08T19:52:44.873 に答える
1

ちょっとしたハックですが、使用できます

WeakHashMap<Car,WeakReference<Car>> cars=new WeakHashMap<Car,WeakReference<Car>>();

public static synchronized Car createCar(int id){
   Car result= new Car(id);
   WeakReference<Car> weakCar=cars.get(result);
   if(weakCar==null){
       cars.put(new WeakReference(result));
       return result;
   }
   Car val= weakCar.get();
   if (val==null){//it may have been collected between cars.get() and weakCar.get()
      cars.put(new WeakReference(result));
      return result;
   } else {
      return val;
   }
}

値は強い参照と見なされるため、値としてweakrefが必要であることに注意してください

于 2012-04-08T20:04:42.407 に答える