线程太多导致socket连接池爆满,进程启动不了

Issue:

某部机上跟其它机器的连接有问题,ping可以通,telnet端口不通,可以其它机器可以连接到该机器上的进程。

java应用启动不起来,产生以下错误。

java.net.SocketException: No buffer space available (maximum connections reached?): listen failed
    at java.net.PlainSocketImpl.socketListen(Native Method)
    at java.net.PlainSocketImpl.listen(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)

Troubleshoot:

打开任务管理器,发现某个进程产生了上千的大量的线程。

Solution:

杀死该进程后,java应用可以成功启动。

icmp协议是IP层的附属协议,不会用TCP连接,所以正常。而telnet则是HTTP请求报文,会使用TCP连接。

原文地址:https://www.cnblogs.com/sui84/p/12070668.html

时间: 2024-08-09 21:11:03

线程太多导致socket连接池爆满,进程启动不了的相关文章

jedis连接池爆满导致的服务不可用

生产环境was线程数300,jedis连接池连接数100. 在业务高峰期,查看日志发现大量could not get a resource from a pool的异常,抓取javacore文件发现was线程大量进入parked状态,查看jedis源码发现连接池底层使用common-pool实现,而common-pool其中有这样一段代码: if (p == null) { if (borrowMaxWaitMillis < 0) { p = idleObjects.takeFirst(); }

Socket连接池

"池"这个概念好像最早是在操作系统的课上听过的,到后来出来工作的第二天组长也跟我提起"池"这个东东.它给我的感觉是某种对象的集合,如果要用的话就取出,不用的话就放回.在学多线程的时候有接触过线程池,在写<Socket 一对多通信>的时候想到了Socket连接池这回事,不过在网上谷歌了一下,发现这类的文章貌似不多,看了一下园友的博文<高性能Socket设计实现>,获益良多,下了份源码来看,虽然有一部分看不明白,而且由于个人水平跑不了那份代码,但

DBCP 1.4 BUG 导致连接池爆满解决方案

dubbo 项目用的 commons-dbcp-1.4  和  commons-pool-1.5.4 实现连接池,导致数据库经常爆满,经过调试,发现了个 dbcp的bug: dbcp 源码: BasicDataSource.java 创建datasource的方法: protected synchronized DataSource createDataSource() throws SQLException { if (closed) { throw new SQLException("Dat

HttpClient 4.3连接池参数配置及源码解读

目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB->服务端处理请求,查询数据并返回),发现原本的HttpClient连接池中的一些参数配置可能存在问题,如defaultMaxPerRoute.一些timeout时间的设置等,虽不能确定是由于此连接池导致接口查询慢,但确实存在可优化的地方,故花时间做一些研究.本文主要涉及HttpClient连接池.请求的参数

HttpClient连接池的连接保持、超时和失效机制

HTTP是一种无连接的事务协议,底层使用的还是TCP,连接池复用的就是TCP连接,目的就是在一个TCP连接上进行多次的HTTP请求从而提高性能.每次HTTP请求结束的时候,HttpClient会判断连接是否可以保持,如果可以则交给连接管理器进行管理以备下次重用,否则直接关闭连接.这里涉及到三个问题: 1.如何判断连接是否可以保持? 要想保持连接,首先客户端需要告诉服务器希望保持长连接,这就是所谓的Keep-Alive模式(又称持久连接,连接重用),HTTP1.0中默认是关闭的,需要在HTTP头加

【转帖】置高并发jdbc连接池

简单的MySQL连接池 [html] view plaincopy <Resource type="javax.sql.DataSource" name="jdbc/TestDB" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://lo

HttpClient连接池

HttpClient连接池的连接保持.超时和失效机制 HTTP是一种无连接的事务协议,底层使用的还是TCP,连接池复用的就是TCP连接,目的就是在一个TCP连接上进行多次的HTTP请求从而提高性能.每次HTTP请求结束的时候,HttpClient会判断连接是否可以保持,如果可以则交给连接管理器进行管理以备下次重用,否则直接关闭连接.这里涉及到三个问题: 1.如何判断连接是否可以保持? 要想保持连接,首先客户端需要告诉服务器希望保持长连接,这就是所谓的Keep-Alive模式(又称持久连接,连接重

Http和Socket连接区别

1.TCP连接 要想明白Socket连接,先要明白TCP连接.手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. 建立起一个TCP连接需要经过“三次握手”: 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k

使用 Tomcat 7 新的连接池 —— Tomcat jdbc pool

Tomcat 在 7.0 以前的版本都是使用 commons-dbcp 做为连接池的实现,但是 dbcp 饱受诟病,原因有: dbcp 是单线程的,为了保证线程安全会锁整个连接池 dbcp 性能不佳 dbcp 太复杂,超过 60 个类 dbcp 使用静态接口,在 JDK 1.6 编译有问题 dbcp 发展滞后 因此很多人会选择一些第三方的连接池组件,例如 c3p0 , bonecp, druid (@wenshao ) 等. 为此,Tomcat 从 7.0 开始引入一个新的模块:Tomcat j