您的位置:首页 > 其它

服务器处理客户端请求线程只升不降问题分析总结

2014-09-12 14:36 477 查看
应用服务器:tomcat

问题现象:

首先服务器稳定正常了运行了大概一年的时间,最近突然出现问题:服务器运行一段时间后客户端再次连接服务器没有响应,都是请求超时,要不响应就变的特别的慢,重启服务一切恢复正常,但是过一段时间就又不行了。

问题分析:

觉得问题非常奇怪,于是用了jconclose jprofiler jvisualvm对服务器进行分析,经分析没有发现内存泄露,线程死锁等问题,查看服务器日志也没有发现异常。只是发现tomcat线程池中正在运行的请求处理线程很多,且线程数直升不降,几乎没有线程回收的迹象。经过查资料大多数人都在说可能是因为死锁造成的,但是dump出来线程信息也没有发现死锁。。。大量的thread=[http-bio-/ip-9085-exec-6]线程让我百思不得其解。搞了好长时间突然想到了一个命令,netstat
-an ,结果豁然开朗,原来有大量的外部ip连接到了服务器(可能是恶意)。

总结:

虽然不是自身服务器的代码造成的,但是在用jprofiler,发现有些东西不是那么理解,不能果断的排查代码造成的问题,从而也就不能快速的定位系统中的问题。

因此,针对线程这一大部分内容,以后有时间应该多多总结一下,现在先总结一下两个小概念:

jvm监视器:

    “在JVM中,每个对象和类在逻辑上都是和一个监视器相关联的,为了实现监视器的排他性监视能力,JVM为每一个对象和类都关联一个锁,锁住了一个对象,就是获得对象相关联的监视器” 

我的理解也就是说“监视器”其实是对锁或者是同步的抽象,synchronized 和ReentrantLock 都是一种监视器的实现,但是“监视器”要求具有排他性.

synchronized(this) 和synchronized(Object.class)的区别:

当一个线程访问一个对象中的一个synchronized(this)同步代码块时,其它线程仍可以访问同一个中是其它非synchronized (this)代码块

synchronized(this)只是锁定一个对象;

synchronized(Object.class)是锁定整个类,如用在静态方法中,对静态变量的访问。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程 线程池
相关文章推荐