2009-04-13 5 views
0

내가 그래서 내가 여부를 걱정겠습니까이 원인 가비지 컬렉션 (Garbage Collection)은

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 등)에 대해 작성 될 수있는 중간/임시 목록의 대부분을 제거하므로 작성되는 중간 오브젝트 수를 최소화합니다.

기본적으로 currentlyAssigned.iterator()가 반환하는 각 요소는 iterator.next()를 호출 할 때까지 계산되지 않습니다. 그때까지는 현재 할당 된 iterable은 일련의 연산 일 뿐이며

단일 개체 작동 기간보다 오래 지속되는 미니 개체의 폭발에 대한 유일한 관심 ... 최대 메모리 사용량은이 경우 상당히 커질 수 있으며 매우 짧은 기간 동안 메모리가 부족할 수 있습니다. 큰 목록 또는 개체를 변환하는 경우 (즉, 모든 문자열이나 다른 문자열에서 ToUpper() 호출). 이것은 where()의 결과가 다른 목록이고 orderby()가 다른 목록을 작성한 경우에만 해당됩니다.

GC가 수명이 짧은 많은 오브젝트를 처리하는 한 아무런 문제가 없습니다. 최신 자바 가비지 컬렉터는 정확한 동작을 처리하도록 크게 최적화되었습니다.

+2

우리의 반복자는 항상 가능한 한 게으르다는 것을 확인했다. 그 중 대부분을 쓴 사람을 안다면 놀라지 않을 것이다! –

1

나는 그것이 게으른 필터, 즉 모든 결과에 대한 참조를 첨부하지 않는다면 어떻게 변형되는지에 달려 있다고 생각합니다. 그 이상 OK 객체는 현명하다. 가비지 콜렉션이 현명한 경우 숨겨진 참조를 유지하지 않고 루트 참조를 잃으면 전체 그래프에 도달 할 수 없어 수집됩니다. 남자에게가는 길은 정말 산뜻합니다.

0

가비지 컬렉터에는 수명이 짧은 오브젝트에 대한 특수 코드가 있으며 매우 저렴합니다. 기본적으로 한 번에 도달 할 수있는 모든 젊은 오브젝트가 표시되고 다른 모든 오브젝트는 한 번에 재생됩니다.

관련 문제