我负责的其中一个项目在空负载的状况下,CPU占用率依然保持着100%左右,线上、测试、开发的服务都同样;是什么致使的呢?在开发环境我查看了请求流量,这个流量能够忽略但CPU占用率一直在60%-100%之间浮动。java
流量能够忽略,但CPU占用依然极其高说明不是请求多致使的资源占用,缘由应该是项目自己自发致使的;自发包括定时任务与死循环,而具体哪一段代码如今也肯定不了。如今咱们就能够借助原生的jdk分析工具来定位是项目哪块出现了问题(你能够用更高级的jprofilter等,一链接,问题一目了然),如下我就采用jdk自带工具jstack、jstat 、jmap等来逐步定位。服务器
从堆栈信息中咱们能够看到是 WAITING致使,这个说明有一个线程长时间占用资源,而其余线程一直处于等待的状态。最终定位出是在一个分布式锁实现的模块中有一个保持锁的代码块有问题。而后经过优化这个分布式锁最终解决了这个问题。经过这次优化,大大节省出了服务器资源(目前这个系统在线上是4台集群,至关于节省了1*4 个cpu,若是是一个上百甚至上千的集群,那么这个资源占用是没法想象的),最主要的是避免了这种状况对系统自己的影响,避免了对正常请求的阻塞。分布式