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

来源:互联网 发布:笔记本win7找不到网络 编辑:程序博客网 时间:2024/06/08 14:21

应用服务器: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)是锁定整个类,如用在静态方法中,对静态变量的访问。



0 0