最近在项目中碰到某个主机CPU突然干到4000%+的情况,且长时间降不下来,在此记录一下问题定位过程和方法

1. 通过 top -p 8510 【java进程ID为8510】 过滤 进程监控列表,按H可以看到 当前java进程中每个线程的繁忙程度。【实际项目未截图,这里是测试环境的截图】
使用printf %X 命令将 1935 转成16进制,078F。 在我的项目中实际的是 2143

2. 使用jstack命令,将java进程的线程运行状况导出来 jstack 8510 > /usr/tomcat.stack
在tomcat.stack文件里查看2143线程的执行内容,发现线程为GC线程.。 因此怀疑是一直gc导致cpu飙升

3. 通过jstat -gc 5000 1000 命令发现,基本上几秒钟就会发生一次fullgc。确认cpu飙高是由于fullgc导致的。
接下来进一步分析:如此频繁fullgc,应该是发生了内存溢出或者其他问题。
4. 通过 jmap -dump:format=b,file=/usr/tomcat.hprof 8510 导出内存快照,使用jvisualvm查看
发现了某个业务对象出现了大概 11万多,明显超出了正常范围。
经过和同事沟通得知,有个功能会触发所有数据库记录的查询,并且放到List中一条一条处理,并且多次点击按钮时候会启动多个线程同时处理,导致内存发生溢出。此处使用线程池限制一下线程数量+分批加载处理即可


5. 以上是问题分析和解决过程。请大家多多沟通和评论哦
本文来自博客园,作者:寒门少爷,转载请注明原文链接:https://www.cnblogs.com/jhans/p/17523652.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探