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 각 루프가 다음 프레임으로 이동하기 위해 한 번 수집됩니까?
JStat에 익숙하지 않지만 일반적으로 ** 실제로 ** 객체가 실제로 가비지 수집되는 질문은 대답하기가 거의 불가능합니다. 그러나 (기본적으로) 지정된 객체에 대한 참조가 더 이상 존재하지 않는 경우 (해당되는 경우) "가비지 수집 가능"으로 간주되고 ** 그럴 수도 있습니다 ** 언제든지 가비지 수집. – Marco13
JStat는 기본적으로 JVM 힙 사용을 검사하는 유틸리티입니다. GCT 열에는 가비지 수집 시간이 표시됩니다. 힙 사용량을 살펴본 결과 Eden Usage가 증가하고 GCT가 증가하지 않은 것을 보았습니다. 적어도 GCT는 증가하지 않았으므로 최소한 가비지 수집 대상이 아닌 것으로 나타났습니다. iterating을 완료 한 CustomIterable이 여전히로드 된 내용을 참조하는지는 확실하지 않지만 실제로는 그렇지 않습니다. 즉,이 CustomIterable은 메모리 누수의 원인이 될 수 있습니다. –
그리고 나는 그로부터 이끌어 낸 결론이 잘못되었다고 생각합니다. 당신은 ** 원유 해킹 **을 시도 할 수 있습니다 : 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