file stream close 하지 않는 경우 메모리 누수가 발생하는 이유

2022. 12. 10. 15:31카테고리 없음

파일으로 예를 들면 파일 출력을 위해서 하드디스크에 저장되있는 파일에 내용을 메모리로 가져와햐 하는데 

파일의 내용을 모두 메모리에 올리는 것이 부담인 경우가 많습니다, 그래서 많은 프로그래밍 언어들이 파일에 대해서 입출력 스트림을 연결합니다.

즉! File 인스턴스를 생성하는 순간 파일의 모든 내용이 메모리에 올라오는 것이 아니라 스트림을 연결하여 언제든지 원하는 부분의 원하는 만큼 내용을 읽어 들일수 있도록한다, 그때 이 연결된 Stream 을 자원이라고 하고 이것을 시스템os에서 

제고해주는 것이다 

 

*os자원: DB커넥션 , 네트워크 커넥션, 쓰레드가 있다.

 

close():

외부자원을 다썼다 얘기하는 것이다 확실한 close()해서 알려야한다,

왜?

스트림을 사용하고 close를 안하면 메모리 반환이 안될 수있다. 그상태로 프로그램이 계속 돌면 메모리가 점차 차게 된다, 

메모리 관리가 안되는것은 memoryleck이 발생했다고 한다, 결국 OOME가 발생하여 프로그램이 종료됩니다.

 

 

EX1)

jvm 밖의 자원 인데  그러면 jvm과 밖의 자원 간에 통신이 일어나게 됩니다. 통신이 중간 끊기면, 문제가 발생합니다.예를 들어 제가 전화를 다른 사람과 하고 있었는데, 다른 사람은 전화를 끊었는데  나는  그걸 모르게 되는 것과 비슷합니다. 나는 전화가 끊긴 줄 모르고 계속 전화기를 잡고 있겠죠. 
jvm도 다른 어딘가에 전화를 걸었고, 따라서 jvm 외 어딘가에서 전화를 받고 있는 중에 jvm이 일방적으로 전화를 끊은 거예요. 근데 상대는 그걸 모르는 거다. 따라서 close를 명확히 해주어서, 외부 자원에 확실한 close가 발생할 수 있도록 해주어야 합니다.  반대로 jvm이 close를 제대로 받지 못하면 동일한 일이 발생하게된다.

 

EX2)

write 같은 건 마지막에 버퍼안에서 flush를 해줘야 자원이 쓰이는데 close안에 자동으로 flush하게 끔 되어 있다.

close를 안한다는 것은 stream이 연결되어있기에 gc가 참조하고 있다고 생각해서 gc동작을 하지 못한다.