tomcat线程池用尽会怎样
用tomcat好多年,我居然不知道tomcat的线程池在那儿设置。在此记录下,并做个测试,当超过这个线程池大小会发现什么事情。配置在server.xml,如下:
<Connector URIEncoding="UTF-8" connectionTimeout="20000" maxThreads="150" port="80" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>
就是这个maxThreads了,需要注意的是这个并不是指tomcat整个进程下最多有多少个线程,而是tomcat能提供http服务的最大线程数。
测试的例子是这样的,先写个页面来显示当前线程名与进程总的线程数,如下view.jsp:
<% out.println(Thread.currentThread().getName()+" "); out.println(Thread.activeCount()); %>
再写一个一直阻塞的页面index.jsp:
<% try{ Thread.sleep(10000000); }catch(Exception e){ } %>
最后再写一个请求这个阻塞页面的main函数:
while (true) { for (int i = 0; i < 10; i++) { new Thread() { public void run() { try { URL url = new URL( "http://localhost/test/index.jsp"); HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); int code = conn.getResponseCode(); System.out.println("code" + code); } catch (Exception e) { e.printStackTrace(); } } }.start(); } Thread.sleep(1000); }
先启动tomcat,可观察到view.jsp显示"http-bio-80-exec-2 11"的字样,再启动上面的main函数。每隔一两秒刷这个view.jsp就会发现最终线程数停留在150多,再查看控制台就能查到如下异常:
如遇到这样的异常,可能就是tomcat线程池用光了。
相关阅读
微信扫描-捐赠支持
加入QQ群-技术交流
评论:
↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑