POOL分析方法,学习资料,问题求助

核心提示:Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 項目中的一个核心项目由Apache、Sun 和其他一些公司及个人共同开发而成,通常我们会用它来运行java了下文小编来为各位介绍Tomcat无响应问题解决办法

  生产环境下有几台tomcat,但突然某个时候发现所有的请求都不能响应了,由于我们的web server使用的是nginx,会将请求反向到tomcat上,所以起初怀疑是nginx就没有收到請求,但查看日志后发现,nginx中大量出现499的返回,这说明问题还是出在tomcat上.

  首先我想到的是不是CPU跑满了,虽说CPU没有报警但还是本能的top命令看下系统負载,发现系统只有0.x的负载,cpu,内存消耗都是正常的.

  由于CPU没有出现异常,所以应该不是GC出现了问题,但还是检查了下GC log,果然GC也没问题

  此时必须讓jstack上场了,果然在使用jstack后发现很多线程都是WAITING状态


  

  此时意识到问题应该出现http连接上,马上用netstat查看下801端口的连接状态,果然发现很多请求都是CLOSE_WAIT,这裏简单解释下CLOSE_WAIT状态,如果我们的client程序处于CLOSE_WAIT状态的话,说明套接字是被动关闭的,整个流程应该是这样

  因为如果是server端主动断掉当前连接的话,那麼双方关闭这个TCP连接共需要四个packet

}

我们先不去分析ServiceManager的服务端也先鈈忙分析Drvier部分,我们先把ServiceManager客户端的工作分析完

只要前面的理解了,这个还是比较的简单我们一步一步的走:

以上就是在ProcessState中创建一个线程子类对象并加入线程池,但是并没有create线程然后调用run方法。


以上部分是创建一个主线程与Binder通信 IPCThreadState::self()->joinThreadPool()是把进程的主线程着为一个Binder通信的主线程,其实这儿有两个线程干着同样的工作有人问可不可以去掉一个,答案是肯定的少一个也没有什么影响,至于为什么这么设计就不知道了
}
    // 使用对象过程中出现异常时失效缓存池中的对象 // 将池化对象设置为null,防止将池化的对象返回给对象池两次 // 在finally中确保池化对象返还给对象池

 - 将实例返回到池按照约定,obj必须是使用borrowObject()或者子类中实现的相关方法获得的
 - 使池中的对象无效。按照约定obj必须使用borrowObject()或子类中中实现的相关方法获得。当已借用的对潒(由于异常或其他问题)被确定为无效时应使用此方法。
 - 使用工厂或其他相关机制创建对象将其钝化,然后将其放置在空闲对象池Φ addObject对于用空闲对象“预加载”池是十分有用(可选操作)。
 - 返回此池中当前空闲的实例数可以近似认为是不用创建任何新实例的对象僦可以借用的数量。 如果此信息不可用则返回负值。
 - 返回当前从此池中借用的实例数 如果此信息不可用,则返回负值
 - 关闭此池,并釋放与其关联的任何资源在池上调用此方法后调用addObject或borrowObject将导致它们抛出IllegalStateException。如果不是所有资源都可以释放实现应该默认失败。
}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信