问题 java.net.SocketException: Too many open files
java.net.SocketException: Too many open filesat java.net.Socket.createImpl(Socket.java:460)at java.net.Socket.connect(Socket.java:587)at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:673)at sun.net.NetworkClient.doConnect(NetworkClient.java:175)at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)at sun.net.www.protocol.https.HttpsClient.(HttpsClient.java:264)at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttps
URLConnection.java:191)at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1156)at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnec
tion.java:177)at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:162)at com.tsing.util.HttpRequestUtil.sendGet(HttpRequestUtil.java:44)
原因是:当单个进程打开的文件句柄(文件操作符)数量,超过了系统配置的上限值时,就会报上面的错误。
ulimit -a 可以查看系统目前资源限制
[root@gongjiaoyoudao-2 ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256996
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 256996
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
open files 默认是1024 ,可以设置更多
分析代码原因主要是连接异常了,但是没有关闭资源,一直占用着资源。
((HttpURLConnection)connection).disconnect();
查看问题时,可以先查看clostwait的命令 clost_wait数量过多就不正常
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ 查看closewait命令
LAST_ACK 19
CLOSE_WAIT 13
ESTABLISHED 4885
FIN_WAIT1 15
TIME_WAIT 3985
一些操作的命令
netstat -atnlp # 直接使用ip地址列出所有处理监听状态的TCP端口,且加上程序名**lsof -i** – 显示所有连接**lsof -p pid** – 使用-p查看指定进程ID已打开的内容