java web应用服务器CPU过高原因及解决思路

1、方法中存在读写文件流的操作,高并发时每个请求产生一个文件流,导致系统CPU急增

解决思路:

a、使用http://sky425509.iteye.com/admin/blogs/2031391 提到的方法,找出CPU高的java线程

b、从线程栈日志信息中,找出导致CPU高的线程方法

c、读写文件流操作移出方法中,避免每次请求都产生一个文件流

2、方法中使用了多线程,未使用连接池或使用了Executors.newCachedThreadPool()创建的接连池,高并发时创建出过多的后台线程

解决思路:

a、使用jstack命令统计出线程数量

b、找出程序中创建线程代码

c、使用Executors.newFixedThreadPool(thread_size)创建固定数量的线程池(线程数固定,无法无收),或者使用new ThreadPoolExecutor(coreSize, maxSize, 60L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())直接构造线程池,

ps:ThreadPoolExecutor线程池的使用请参考另一篇博文http://sky425509.iteye.com/admin/blogs/2040794

3、gc线程比较费时

解决思路:

a、查看一下gc策略是否合理

b、用命令jmap -histo [PID] 分析是哪个类占用内存比较多,分析出可能存在内存泄露的地方

c、jvm内存调优,可使用Jconsole、visalvm、probe等工具查看java虚拟机中方法区、堆区(新生代、幸存代、老年代)、线程栈的内存分配,根据实际情况进行优化

4、代码中存在死循环

解决思路:参考问题1的处理思路

猜你喜欢

转载自sky425509.iteye.com/blog/2043072