java.net.SocketTimeoutException
原因:
超时分为连接超时和读取超时。
解决方法:
连接超时往往是由于网络不稳定造成的,但是读取超时不一定是网络延迟造成的,很有可能是下游服务的响应时间过长。
java.net.BindException: Address already in use: JVM_Bind
端口被占用。当服务器端调用 new ServerSocket(port) 或者 Socket.bind 函数时,如果端口已经被占用,就会抛出这个异常。
java.net.ConnectException: Connection refused: connect
原因:
连接已关闭
java.net.SocketException: Connection reset/Connect reset by peer:Socket write error
原因:
是通信的一方已经将Socket 关闭
解决方法:
程序退出前要主动关闭所有的网络连接。
检测通信的另一方的关闭连接操作,当发现另一方关闭连接后自己也要关闭该连接。
java.net.SocketException: Broken pipe
通信管道已坏,原因和解决方法同上。
java.net.SocketException: Too many open files
原因:
指进程打开文件句柄数超过限制。当并发用户数比较大时,服务器可能会报这个异常。这是因为每创建一个 Socket 连接就需要一个文件句柄,此外服务端程序在处理请求时可能也需要打开一些文件。
你可以通过lsof -p pid命令查看进程打开了哪些文件,是不是有资源泄露,也就是说进程打开的这些文件本应该被关闭,但由于程序的 Bug 而没有被关闭。
解决方法:
如果没有资源泄露,可以通过设置增加最大文件句柄数。具体方法是通过ulimit -a来查看系统目前资源限制,通过ulimit -n 10240修改最大文件数。
Tomcat的两个重要参数
acceptCount 和maxConnections。acceptCount 用来控制内核的 TCP 连接队列长度,maxConnections用于控制 Tomcat 层面的最大连接数,Tomcat 的最大并发连接数等于maxConnections + acceptCount。我们可以通过调整 acceptCount 和相关的内核参数somaxconn,增加了系统的并发度。