最近项目中一个模块出现一个问题,本人做的比较浅显,所以很简单的问题一直搞了好几天,通过各种查资料、工具终于分析除了问题。问题如下:

现在对tomcat一个工程(会通过httpurlconnection去请求别的资源)并发过多时候,tomcat直接跟挂去一样,再输入任何地址都一直不响应。通过java自带的检测工具看到像http-8080-1这样的http线程全部一直处于RUNNABLE状态,正常应该请求完处于WAITING。


  其实这个问题很简单,去csdn等发问,版主说是死锁了--!结果耗去我很多时间去检查、分析哪里死锁了,其实这个不是线程死锁,忍不住吐槽下,不过也有我的原因在里面。最后通过jconsole,jvisualvm分析下tomcat进程,用jstack分析了thread dump,发现只要并发超过最大线程数然后就会这样,所有http线程都是在处理此工程的请求。而真实情况是此工程需要请求另一个服务(也部署在tomcat)才能得到返回结果,这样就造成了所有线程都是在等待返回结果(因为httpurlconnection没有设置超市时间),造成另一个服务一直获得不到线程去处理,从而造成了这种情况!

附上原来的实现原理,引以为戒!

packag search;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class test extends HttpServlet { public test() {
super();
} public void destroy() {
super.destroy();
} public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String url = "http://localhost:8080/solr/select/?q=name%3A%E8%B4%B5%E5%B7%9E&version=2.2&start=0&rows=10&indent=on&wt=json";
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
PrintWriter printWriter = response.getWriter();
String returnStr=getInfoFromService(url);
System.out.println(returnStr);
printWriter.write(returnStr);
printWriter.close();
} private String getInfoFromService(String url) {
String resultStr = "";
try {
URL destURL = new URL(url);
HttpURLConnection urlConn = (HttpURLConnection) destURL
.openConnection();
urlConn.setRequestMethod("GET");
urlConn.setDoOutput(true);
urlConn.setDoInput(true);
urlConn.setUseCaches(false);
InputStreamReader inStream = new InputStreamReader(urlConn
.getInputStream(), "utf-8");
resultStr = getRequestContent(inStream);
inStream.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return resultStr;
} private String getRequestContent(Reader reader) throws IOException {
StringBuffer sb = null;
sb = new StringBuffer();
char[] data = new char[1024];
int i = reader.read(data);
while (i != -1) {
sb.append(data, 0, i);
i = reader.read(data);
}
String sreq = sb.toString();
return sreq;
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} public void init() throws ServletException {
} }

tomcat线程一直处于RUNNABLE,不接受请求的更多相关文章

  1. Tomcat如何使用线程池处理远程并发请求

    Tomcat如何使用线程池处理远程并发请求 通过了解学习tomcat如何处理并发请求,了解到线程池,锁,队列,unsafe类,下面的主要代码来自 java-jre: sun.misc.Unsafe j ...

  2. Tomcat线程池配置

    简介  线程池作为提高程序处理数据能力的一种方案,应用非常广泛.大量的服务器都或多或少的使用到了线程池技术,不管是用Java还是C++实现,线程池都有如下的特点:线程池一般有三个重要参数: 最大线程数 ...

  3. 聊下并发和Tomcat线程数(错误更正)

    本文前半部分结论存在严重错误,请看最后2015-1-20更新部分. 最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池 ...

  4. 聊下并发和Tomcat线程数(Updated)

    最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多请求超过了1s. 服务器性能很好,Tomcat版本是 ...

  5. Tomcat线程池,更符合大家想象的可扩展线程池

    因由 说起线程池,大家可能受连接池的印象影响,天然的认为,它应该是一开始有core条线程,忙不过来了就扩展到max条线程,闲的时候又回落到core条线程,如果还有更高的高峰,就放进一个缓冲队列里缓冲一 ...

  6. 浅谈并发和tomcat线程数

    假设Tomcat每到固定一个时间会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多请求超过了1s. 服务器性能很好,Tomcat版本是7.0.54,配置如下 & ...

  7. 详解Tomcat线程池原理及参数释义

    omcat线程池有如下参数: maxThreads, 最大线程数,tomcat能创建来处理请求的最大线程数 maxSpareTHreads, 最大空闲线程数,在最大空闲时间内活跃过,但现在处于空闲,若 ...

  8. Tomcat线程数与处理速度的关系

    问题:Tomcat线程数是不是越大越好呢? 答案肯定是否定的. Tomcat的处理速度跟线程数不是完全成正比的,设置不恰当会出现相反的效果.服务的负载计算包括了CPU的使用率和资源等待. 第一种情况, ...

  9. Tomcat线程池的深入理解

    1.工作机制: Tomcat启动时如果没有请求过来,那么线程数(都是指线程池的)为0: 一旦有请求,Tomcat会初始化minSpareThreads设置的线程数: 2.线程池作用: Tomcat的线 ...

随机推荐

  1. node.js(基础四)_express基础

    一.前言                                                           本次内容主要包括: 1.express的基本用法 2.express中的静 ...

  2. Go结构体

    当我们要表示同一种数据类型时候,可以用到数组,切片和字典. 当我们要表示不同的数据类型呢?这时候就要用到结构体了 一:定义struct 关键字 type 和 struct 来定义结构体 type st ...

  3. linux ------ 使用 screen 后 SSH 断开后程序依旧能在后台运行

    为什么ssh断开后你运行的进程会退出呢? 因为所有进程都得有个父进程.当你ssh到一个服务器上时,打开的shell就是你所有执行命令的父进程. 当你断开ssh连接时,你的命令的父进程就没了.如果处理不 ...

  4. Python三十个常见的脚本汇总

    1.冒泡排序     2.计算x的n次方的方法     这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发.爬虫.数据分析.数据可视化.机器学习等.送给正在 ...

  5. CodeForces621E 快速矩阵幂优化dp

    有时些候在用快速矩阵幂优化dp的时候,它的矩阵乘法是不那么容易被具体为题目背景的意思的,大多数时候难以理解矩阵之间相乘的实际意义,正如有时候我们不知道现在在做手头这些事情的意义,但倘若是因一个目标而去 ...

  6. Maven 命令参数 整理

    命令参数 备注 mvn -v --version 显示版本信息; mvn -V --show-version 显示版本信息后继续执行Maven其他目标; mvn -h --help 显示帮助信息; m ...

  7. 关于Mysql的高级查询的操作

    前言:作为一名后端的程序员操作数据库的能力是我们基本的技能,而连表查询是我们的这个技能的关键点所在.注意这里顾明思义是对数据的查询的操作 (一).联合查询(关键字union/union all) 什么 ...

  8. Linux系统中errno对应的中文意思 errno.h

    /usr/include/asm/errno.h #define EPERM 1 /* Operation not permitted */操作不允许 #define ENOENT 2 /* No s ...

  9. ` ` ` ` ` ` ` `

    字符实体 说明   这是我们使用最多的空格,也就是按下space键产生的空格.在HTML中,如果你用空格键产生此空格,空格是不会累加的(只算1个).要使用html实体表示才可累加.   占据的宽度正好 ...

  10. 批量获取oracle的表和表字段注释【原】

    批量获取oracle的表和表字段注释 --用户表注释表 SELECT * FROM USER_TAB_COMMENTS WHERE TABLE_NAME LIKE 'WEB_ISC_%'; --显示指 ...