2017-09-08 4 views
0
I 사용자 정의 반복자했다

가정합니다자바에서 사용자 지정 반복 가능 객체와 가비지 컬렉션

class CustomIterator implements Iterator<CustomObject> { 

     @Override 
     public Object next() { 
       Iterator<Things> readResults = readFromApi(); 
       return new CustomObject(readResults); 
     } 

     ...other stuff 
} 

을 그리고 내가

class CustomIterable implements Iterable<CustomObject> { 

     CustomIterator<CustomObject> iterator; 

     public CustomIterable(final CustomIterator<CustomObject> cursorIterator) { 
        this.iterator = cursorIterator; 
     } 

     @Override 
     public Iterator<CustomObject> iterator() { 
       return iterator; 
     } 

     ... other stuff. 
} 

의 Iterable

사용자 정의를 구현 그리고 내가 각각 자바에서 내 사용자 정의 반복자를 사용 루프, 즉

next() 메소드를 통해 인스턴스화 된 각 CustomObject는 Garbag e 각 루프가 다음 프레임으로 이동하기 위해 한 번 수집됩니까?

답변

0

그래서 JStat 보고서를 살펴본 결과 객체가 가비지 수집되지 않은 것처럼 보입니다.

내 결과는 다음과 같습니다.

는 기본적으로 내가 그때 10 밀리 초마다 각 루프 라인의에서 중단 점을 설정하고이 과정에 그러면 jstat를 엮은하고 폴링을 시작 테스트

public void testThisBehavior() { 
    final Iterable<CustomObject> customIterable = createCustomIterable(); //Should iterate over 3 objects 

    for(final CustomObject obj : customIterable) { 
     System.out.println(obj); 
    } 
} 

을 썼다.

반복되는 과정을 거치면서 GCT가 증가하지 않는 동안 내 에덴 공간이 늘어났습니다.

S0C S1C S0U S1U  EC  EU  OC   OU  MC  MU CCSC CCSU YGC  YGCT FGC FGCT  GCT 

    ... This was the usages when I hit my breakpoint. 
    20992.0 14336.0 0.0 14317.6 274432.0 212415.4 243712.0 37918.2 71936.0 70562.4 8960.0 8595.9  9 0.069 3  0.150 0.219 
    ... This was the first object getting created I believe after I pressed run, the EU went up but GCT never increase. 
    20992.0 14336.0 0.0 14317.6 274432.0 217920.9 243712.0 37918.2 71936.0 70562.4 8960.0 8595.9  9 0.069 3  0.150 0.219 
    ... This was the second object getting created 
    20992.0 14336.0 0.0 14317.6 274432.0 224798.6 243712.0 37918.2 71936.0 70562.4 8960.0 8595.9  9 0.069 3  0.150 0.219 

    ... This was the third object getting created I believe 
    20992.0 14336.0 0.0 14317.6 274432.0 244026.5 243712.0 37918.2 71936.0 70562.4 8960.0 8595.9  9 0.069 3  0.150 0.219 

나는이 테스트를 통해의 GCT 꽤 자주 폴링에도 불구하고 변경되지 않을 것으로 나타났습니다, 그래서 가비지 수집기가 개체를 수집하지 않은 생각합니다. 이것이 의미가 있다고 생각합니다. 왜냐하면 일단 끝에 도달하면 더 이상 왼쪽이 없다는 것입니다. 즉, 이미로드 된 것이 무엇이든 초기화되었다는 것을 의미합니다.

+1

JStat에 익숙하지 않지만 일반적으로 ** 실제로 ** 객체가 실제로 가비지 수집되는 질문은 대답하기가 거의 불가능합니다. 그러나 (기본적으로) 지정된 객체에 대한 참조가 더 이상 존재하지 않는 경우 (해당되는 경우) "가비지 수집 가능"으로 간주되고 ** 그럴 수도 있습니다 ** 언제든지 가비지 수집. – Marco13

+0

JStat는 기본적으로 JVM 힙 사용을 검사하는 유틸리티입니다. GCT 열에는 가비지 수집 시간이 표시됩니다. 힙 사용량을 살펴본 결과 Eden Usage가 증가하고 GCT가 증가하지 않은 것을 보았습니다. 적어도 GCT는 증가하지 않았으므로 최소한 가비지 수집 대상이 아닌 것으로 나타났습니다. iterating을 완료 한 CustomIterable이 여전히로드 된 내용을 참조하는지는 확실하지 않지만 실제로는 그렇지 않습니다. 즉,이 CustomIterable은 메모리 누수의 원인이 될 수 있습니다. –

+0

그리고 나는 그로부터 이끌어 낸 결론이 잘못되었다고 생각합니다. 당신은 ** 원유 해킹 **을 시도 할 수 있습니다 : for (int i = 0; i <10; i ++) {System.gc(); Thread.sleep (1000); } "가비지 콜렉션을 강제 적용"(예상 효과가 반드시 필요한 것은 아닐지라도). 핵심은 [탈출 분석] (https://docs.oracle.com/javase/8/docs/technotes/guides/vm/performance-enhancements-7.html#escapeAnalysis)을 사용하는 최신 GC 및 JIT는 단순히 정리할 수 없다는 것입니다 필요하지 않기 때문에 그러한 단일 물체를 올리십시오 *. GC 분석은 마술 일뿐 아니라 * 검은 색 * 마술입니다 ... – Marco13