2009-04-13 25 views
0

を発行し、私は私がいるかどうか心配ですので、私はより簡潔な読みやすい方法は、この原因ガベージコレクションが

Iterable<? extends NewOrder > currentlyAssigned = 
     IterableQuery. 
      from(orders). 
      where(placedInLast10Days). 
      orderBy(lastName). 
      select(orderToNewOrder); 

にクエリ収集を行うことができGoogle Collections

public class IterableQuery { 

    public static <T> Where<T> from(Iterable<T> originalCollection) { 
     return new Where<T>(Iterables.transform(originalCollection, IterableQuery.<T>SAME())); 
    } 

    private static <T> Function<T, T> SAME() { 
     return new Function<T, T>(){ 
     public T apply(T arg0) { 
      return arg0; 
     } 
     }; 
    } 


    public static class SelectOrderBy<T>{ 

     private final Iterable<T> iterable; 

     public SelectOrderBy(Iterable<T> iteable) { 
     this.iterable = iteable; 
     } 

     public SelectOrderBy<T> orderyBy(Comparator<T> sort){ 
      Ordering.forComparator(sort).sort((List< ? extends T>) iterable); 
      return new SelectOrderBy<T>(iterable); 
     } 

     public <F> Iterable<F> select( Function<? super T,? extends F> function){ 
     return Iterables.transform(iterable, function); 
     } 
     public Iterable<T> selectEveryThing(){ 
     return iterable; 
     } 
    } 


    public static class Where<T>{ 

     private final Iterable<T> iterable; 

     public Where(Iterable<T> iterable) { 
     this.iterable = iterable; 
     } 

     public SelectOrderBy<T> where(Predicate<T> predicate) { 
     return new SelectOrderBy<T>(Iterables.filter(iterable, predicate)); 
     } 
    } 

} 

の上でDSLのような少しのLINQを書いただろうこの方法ではミニオブジェクトが爆発し、ガベージコレクションの問題(またはその他の問題)が発生します。

+1

ガベージコレクションの問題?私はそれを心配しないで管理された言語でプログラムします:) –

答えて

3

Google Collectionsでは、ほとんどの反復子で遅延実行が使用されていると思います。遅延実行は、各呼び出し(where、orderbyなど)のために作成できる中間/一時リストのほとんどを削除するので、作成される中間オブジェクトの数を最小限に抑えます。

iterator.next()を呼び出すまで、currentlyAssigned.iterator()によって返される各要素は基本的には計算されません。それまでは、あなたのcurrentlyAssigned iterableは単なる一連の操作であり、それ以上はありません。

これらのオブジェクトが単一の要素操作の持続時間よりも長く続く場合、ミニオブジェクトの爆発が懸念されます...この場合、ピークメモリ使用量がかなり大きくなり、非常にメモリが不足する可能性があります大きなリストや、オブジェクトを変換していた場合(つまり、すべての文字列などでToUpper()を呼び出す場合)これは、where()の結果が別のリストであった場合、orderby()が別のリストを作成した場合などに限られます。

GCが短命のオブジェクトを多く扱う限り、問題はありません。現代のJavaガベージコレクタは、その正確な振る舞いを扱うように大きく最適化されています。

+2

私たちのイテレータは常にあなたがそれらの大部分を書いた男を知っていた場合あなたを驚かせることはありません可能な限り怠惰であることを確認! –

1

私はそれが怠惰なフィルタのように、どのように変換動作に依存すると思う、つまり、すべての結果への参照を添付しません。そのOK以上のオブジェクトは賢明にカウントされます。ガベージコレクションは賢明で、隠れた参照を保持していません。ルート参照が失われると、グラフ全体が到達不能になり、収集されます。これは本当にきれいです。

0

ガベージコレクタには、短命オブジェクト用の特別なコードがあり、非常に安価です。基本的にはすべての到達可能な若いオブジェクトがマークされ、他のすべてのオブジェクトが1回のスワップで再生されます。

関連する問題