본문 바로가기

Lecture & Tip/eclipse_android

lsof 에서 java가 pipe를 많이 남기는 이유.

자바에서 발생하는 FileNotFoundException (too many open files)에대해 분석을 하다가 새로운 사실을 알았다.

일단 위의 Exception은 File Descriptior가 너무 많이 열렸다는 것이고

Linux에서 가지고 있는 fd-max값을 넘겼다는 것.

어떤 파일들이 열렸는지 확인을 하기위해 lsof command를 쳐보니.

java 1447 root 7w FIFO 0,6     24992 pipe

와 같이 jvm에서 pipe를 아주 많이 만들고 있는 것이 아닌가? 두둥..

그래서 왜이런 일이 있는지 구글신에 문의 결과.

JVM pipe는 거의 Stream에 의해 생성이 되고.
Runtime.exec("cmd");

를 사용하였을 경우 내부적으로 3개의 Stream (InputStream, OutputStream, ErrorStream) 이 생성되는데

이것을 exec이후에는 무조건 닫아줘야한다는 것.

exec() method의 Return value인 Process Objectdestroy() 호출을 하거나

각각 Stream을 얻어와서 close()해야한다는 것.!

앞으로 exec를 사용하거나 Stream을 사용할때 ipc pipe와도 관련이 있다는 사실을 유념해야겠다.