2013-09-07 2 views
0

이해가 안됩니다. 예를 들어, 코드에서 OutputStream 유형의 변수를 사용하는 경우, 사용을 중단 할 때 close()를 호출해야합니다. 왜 이렇게 구현되지 않았습니까? GC는 close()를 호출 할 때 close 이 변수는?닫기 가능한 클래스에서 close()를 호출 할 수없는 이유는 무엇입니까?

업데이트 : 확인 지금까지 체결 한 것 : 관리되지 않는 미해결 자료를 공개하는 것은, 그것은 수뿐만 아니라 우리가 뒤에 지금 내부 동작을하지 않는 것이 더 중요한 것은 메모리를 해제에 관한의 양에 한계가 존재 이 리소스 (연결 수/처리기)가 가능한 한 빨리 해제해야하는 이유입니다. 내가 맞습니까? 왜냐하면 그것이 메모리에 관한 것이라면 GC가 관리되는 방법으로하는 것처럼 작동하지 못하는 이유를 알지 못하기 때문입니다.

+0

대부분의 스트림이 구현되어 finalize가 close를 호출하지만 finalize가 호출되는 gurentee가 없습니다. – MadProgrammer

+1

업데이트 정보 : 정확하게는 메모리에 관한 것이 아니라 JVM 외부의 것들입니다. –

답변

4

close 대부분의 경우 결국 finalize 방법을 통해 GC에 의해 자동으로 호출됩니다 (모든 클래스 개체를 파괴 할 때 GC에 의해 호출되는 등 finalize을 가질 수 있습니다, 그것은 일반적으로 구현 될 자원을 보유 Closable 유형 전화 close). 문제는 물론 언제 일어날지를 제어 할 수 없다는 것입니다. 개체가 필요 없게 된 시점부터 10 초 또는 10 분이 소요될 수 있으며 할당 된 자원을 계속 사용합니다. 따라서 더 이상 필요하지 않으면 자원 처리를 정리하는 것이 좋은 스타일입니다. 또한

, 자바 7 이후 실제로이 작업을 수행 할 수 있습니다

try (BufferedReader br = 
       new BufferedReader(new FileReader(path))) { 
    return br.readLine(); 
} 

그리고 close은 try 블록의 끝에서 자동으로 호출됩니다.

자세한 내용은 documentation을 참조하십시오.

그리고 마지막으로, Closable이 있고 처음부터 명시 적 폐쇄가 필요 일들이 직접 JVM에 의해 관리되지 않으며, 따라서 자동으로 GC 회수 할 수없는 자원이다. 이러한 리소스는 인스턴스 파일, 소켓 또는 오디오 출력용입니다.

+0

ummm 클로저 블 타입의 지역 변수가 GC에 의해 동시에 정리되지 않을까 신경 쓰지 않아도됩니다. 클로저 블 타입의 지역 변수를 왜 신경 써야합니까? – MaxNevermind

+0

cloesable는 일반적으로 해당 객체가 파일 설명자와 같이 JVM을 직접 제어하지 않는 일부 시스템 자원을 보유하고 있음을 나타냅니다. –

+0

"해당 객체가 JVM을 직접 제어 할 수없는 일부 시스템 자원을 보유하고 있습니다."그러나 여전히 close()를 호출 할 수 있습니까? 그래서 우리는 그것에 대한 통제권을 가지고 있습니까? 우리가한다면 GC는 그 자체로 그것을 할 수 있습니까? – MaxNevermind