2012-07-25 3 views
1

고객 시스템에서 너무 많은 열린 파일 오류가 발생했습니다. 현재 FD 제한이 최대로 설정되어 있으며 일주일에 한 번씩 발생합니다.바운드 상태의 소켓이 너무 많습니다.

lsof 및 netstat o/p를보고 난 후 너무 많은 소켓을 보류 상태 (20K)로 볼 수있었습니다. 이 상태가 일시적인 상태라는 것을 알기 때문에 실제로 누출되는 부분을 찾을 수는 없습니다. 나는이 문제를 해결하는 방법 단서를 받고 있지 않다

>java.net.InetSocketAddress 
>> sun.nio.ch.SocketChannelImpl 
    >>>sun.nio.ch.SocketAdaptor 
    >>>>java.net.SocksSocketImpl 
    >>>>>java.lang.ref.Finalizer 

난 다음 GC 참조를 참조 경계 소켓의 하나에 대한 힙 덤프에서 볼 때. 나는 같은 것에 대한 전문가 의견이 필요합니까?

답변

3

소켓이 close()인지 확인하려면 Finalizer 스레드에서 닫습니다.

Finalizer 스레드는 단일 스레드이며 느린 경우 (예 : 연결을 올바르게 닫지 않았기 때문에) 사용자가 정리하는 것보다 빠르게 소켓을 만들 수 있습니다.

먼저 확인해야 할 것은 스택 덤프를 가져 와서 파이널 라이저 스레드가 일반적으로 기다리는 것이 무엇인지 확인하는 것입니다. 둘째로 을 확인하십시오. 끝내면 소켓 연결을 항상 닫습니다. 소켓은 여전히 ​​Finalizer 큐에 추가되지만 이미 닫혀 있는지 확인하기 위해 시간이 필요하지 않습니다.

1

소켓이 심하게 누출됩니다. 어딘가에 있어야 마땅히 마침내 블록에서 그들을 닫지 않을 것입니다. 나는 BOUND 상태에서 여러분이 새로운 Socket()을 호출하고 connect()를 호출했다는 것을 추측 할 것이다. 실패하면 소켓을 닫지 않지만 다른 많은 가능성이있을 수있다.

+0

힌트를 보내 주셔서 감사합니다. 문제를 조사 할 수있었습니다. . 실제로 nio는 unresovedAddress 예외를 던지고있었습니다.이 경우 soket 리소스는 정리되지 않았지만 IOException이 발생되면 모든 리소스가 정리되고 릴리스되었습니다. 이제 UnresolvedAddressException을 처리했습니다. . 수정은 간단했지만 문제를 해결할 시간이 필요했습니다. :) – Pradeep

0

힌트를 주셔서 감사합니다. 문제를 조사 할 수있었습니다. . 실제로 nio는 unresovedAddress 예외를 던지고있었습니다.이 경우 soket 리소스는 정리되지 않았지만 IOException이 발생되면 모든 리소스가 정리되고 릴리스되었습니다. 이제 UnresolvedAddressException을 처리했습니다. . 수정은 간단했지만 문제를 해결하는 데 시간이 걸렸습니다.