열린 JVM :열려있는 파일이 너무 많습니다 : 얼마나 많은 사람들이 무엇인지, 개방, 얼마나 많은 수 나는 자바에서이 예외 얻고있다
java.io.FileNotFoundException: (Too many open files)
나는이를 제거 할 수있는 방법을 찾고 있어요를 문제.
이 오류는 분명히 JVM이 너무 많은 핸들을 할당했으며 기본 OS가 더 이상 사용하지 못하게합니다. 어딘가에 부적절하게 닫힌 연결/스트림이있는 누출이 있습니다.
이 프로세스는 논스톱으로 실행되며 결국 예외가 throw됩니다. 12-14 일의 가동 후 반복적으로 발생합니다.
어떻게 싸우나요? JVM에서 할당 된 핸들 목록을 얻는 방법이 있습니까? 나는 그들을 인쇄하여 그것이 어떻게 성장하는지 볼 수 있기를 바랍니다. 프로덕션 시스템이고 개발시 재현하기가 어려우므로 프로파일 러를 사용할 수 없습니다. 어떠한 제안?
-Xmx에 지정된 총 용량의 1 %에 도달하면 사용 가능한 힙 크기를 모니터링하고 "경보"를 발생시킵니다. 또한 스레드 수가 500을 초과하면 확실히 무언가가 손에 닿지 않게됩니다. 자, 거기에 내 JVM이 너무 많은 핸들 OS에서 할당하고 그들을 돌려주지 않는 것을 알 수있는 방법입니다. 소켓, 열어 놓은 파일 등등. 내가 알았다면, 언제 어디서 볼지를 알고 있었을 것이다.
당신이 더 많은 것을 제공 할 수 JVM 및 OS에 대한 정보? 또한 개발 환경에서이 문제를 재현하는 데 더 많은 노력을 기울이는 것이 좋습니다. 번거 로울 수 있지만 그런 문제가 생기면 프로덕션 시스템에서 "관찰 및보고"하는 데 오랜 시간이 걸릴 것입니다. – Timothy
가상화를 실행하는 Linux에서 반복적으로 발생하며 2 주 동안로드가 많이 걸린 테스트를 실행하여이 문제를 재현 할 수있는 옵션이 없습니다. 나는 이것이 창문 상자에서 일어나는 것을 보지 못했다. 당신이 옳아 요, dev에 잡는 것이 가장 좋지만, 미래에 대한 자체 모니터링을 위해 서버 자체에 어떤 기능을 내장하고 싶습니다. – Dima
편집하십시오. JVM이 어떤 파일을 열 었는지 알려줄 수는 없다고 생각합니다. Sun이 추가 할 수있는 좋은 기능 일 수도 있지만 그때까지는 외부 프로세스를 사용해야 만 알 수 있습니다. JVM 내부에서 실제로 필요하다면 lsof를 실행하고 결과를 리턴하는 코드를 작성하십시오. 또한 열린 파일의 한도를 변경할 수 있습니다. 예를 들어 Linux에서는 /etc/security/limits.conf 파일을 수정할 수 있습니다. – bramp