精华内容
下载资源
问答
  • a、使用http://sky425509.iteye.com/admin/blogs/2031391 提到的方法,找出CPU高java线程 b、从线程栈日志信息中,找出导致CPU高的线程方法 c、读写文件流操作移出方法中,避免每次请求都产生一个文件流   2...

     

    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的处理思路

    展开全文
  • 最近遇到一个java应用造成了服务器CPU使用率过高,最后查询,问题是因为在tomcat下重新部署应用的时候没有kill掉tomcat进程,造成应用中的数据库连接池进程中的锁不能被释放,死循环造成了cpu使用率过高的现象,详细...

    最近遇到一个java应用造成了服务器CPU使用率过高,最后查询,问题是因为在tomcat下重新部署应用的时候没有kill掉tomcat进程,造成应用中的数据库连接池进程中的锁不能被释放,死循环造成了cpu使用率过高的现象,详细原因就不做详细分析了,主要分享一下问题排查的过程。

    使用top命令查询服务cpu使用情况

    127685d40dba?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    服务器资源使用率

    可以看到31737这个进程的CPU使用率巨大

    使用top -Hp 31737查询31737进程中各个线程的资源使用率

    top -Hp 31737

    使用top -Hp 31737查询31737进程中各个线程的资源使用率

    127685d40dba?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    31737进程中各个线程的使用率

    由于当时的截图丢失了,简单说一下,使用top -Hp 31737命令查询到31737进程中,一个线程id为5322占用CPU过高

    使用printf "%x\n" 5322把线程id转化为十六进制

    printf "%x\n" 5322

    因为打印线程栈的时候,本地线程标识nid是用十六进制表示的,使用该命令把线程id转化为十六进制

    127685d40dba?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    5322的十六进制为14ca

    使用jstack命令打印堆栈信息

    jstack 31737 | grep -10 14ca

    使用jstack 31737 | grep -10 14ca打印31737的堆栈信息,并查找本地线程标识为14ca的线程堆栈信息

    127685d40dba?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    31737的堆栈信息

    如图,线程的状态为TIMED_WAITING,对象等待中,查看源码

    127685d40dba?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    出现问题的代码

    发现问题的原因就不做详细分析了,这里主要是分享一下问题排查的过程

    度娘一下有个大神回答的不错,连接在这里,有兴趣的可以自己去看一下https://stackoverflow.com/questions/6981564/why-must-the-jdbc-driver-be-put-in-tomcat-home-lib-folder/7198049#7198049

    127685d40dba?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

    大神的回答

    大致原因就是因为在tomcat下重新部署应用的时候没有kill掉tomcat进程,造成应用中的数据库连接池进程中的锁不能被释放

    这次排查问题的过程就为大家分享到这里,欢迎大家来交流,指出文中一些说错的地方,让我加深认识,愿大家没有bug,谢谢!

    展开全文
  • 1、故障现象客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现CPU占用率过高。2、CPU占用过高问题定位2.1、定位问题进程使用top命令查看资源占用情况,...

    1、故障现象

    客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现CPU占用率过高。

    2、CPU占用过高问题定位

    2.1、定位问题进程

    使用top命令查看资源占用情况,发现pid为14063的进程占用了大量的CPU资源,CPU占用率高达776.1%,内存占用率也达到了29.8%

    [ylp@ylp-web-01 ~]$ top

    top - 14:51:10 up 233 days, 11:40, 7 users, load average: 6.85, 5.62, 3.97

    Tasks: 192 total, 2 running, 190 sleeping, 0 stopped, 0 zombie

    %Cpu(s): 97.3 us, 0.3 sy, 0.0 ni, 2.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

    KiB Mem : 16268652 total, 5114392 free, 6907028 used, 4247232 buff/cache

    KiB Swap: 4063228 total, 3989708 free, 73520 used. 8751512 avail Mem

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

    14063 ylp 20 0 9260488 4.627g 11976 S 776.1 29.8 117:41.66 java

    2.2、定位问题线程

    使用ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况,发现该进程的多个线程占用率很高,

    [ylp@ylp-web-01 ~]$ ps -mp 14063 -o THREAD,tid,time

    USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME

    ylp 361 - - - - - - 02:05:58

    ylp 0.0 19 - futex_ - - 14063 00:00:00

    ylp 0.0 19 - poll_s - - 14064 00:00:00

    ylp 44.5 19 - - - - 14065 00:15:30

    ylp 44.5 19 - - - - 14066 00:15:30

    ylp 44.4 19 - - - - 14067 00:15:29

    ylp 44.5 19 - - - - 14068 00:15:30

    ylp 44.5 19 - - - - 14069 00:15:30

    ylp 44.5 19 - - - - 14070 00:15:30

    ylp 44.5 19 - - - - 14071 00:15:30

    ylp 44.6 19 - - - - 14072 00:15:32

    ylp 2.2 19 - futex_ - - 14073 00:00:46

    ylp 0.0 19 - futex_ - - 14074 00:00:00

    ylp 0.0 19 - futex_ - - 14075 00:00:00

    ylp 0.0 19 - futex_ - - 14076 00:00:00

    ylp 0.7 19 - futex_ - - 14077 00:00:15

    [root@localhost logs]# ps -mp 2633 -o THREAD,tid,time | sort -rn

    第二条是根据CPU占比由高到低排列,从输出信息可以看出,14065~14072之间的线程CPU占用率都很高

    2.3、查看问题线程堆栈

    挑选TID为14065的线程,查看该线程的堆栈情况,先将线程id转为16进制,使用printf “%x\n” tid命令进行转换

    [ylp@ylp-web-01 ~]$ printf "%x\n" 14065

    36f1

    再使用jstack命令打印线程堆栈信息,命令格式:jstack pid |grep tid -A 30

    [ylp@ylp-web-01 ~]$ jstack 14063 |grep 36f1 -A 30

    "GC task thread#0 (ParallelGC)" prio=10 tid=0x00007fa35001e800 nid=0x36f1 runnable

    "GC task thread#1 (ParallelGC)" prio=10 tid=0x00007fa350020800 nid=0x36f2 runnable

    "GC task thread#2 (ParallelGC)" prio=10 tid=0x00007fa350022800 nid=0x36f3 runnable

    "GC task thread#3 (ParallelGC)" prio=10 tid=0x00007fa350024000 nid=0x36f4 runnable

    "GC task thread#4 (ParallelGC)" prio=10 tid=0x00007fa350026000 nid=0x36f5 runnable

    "GC task thread#5 (ParallelGC)" prio=10 tid=0x00007fa350028000 nid=0x36f6 runnable

    "GC task thread#6 (ParallelGC)" prio=10 tid=0x00007fa350029800 nid=0x36f7 runnable

    "GC task thread#7 (ParallelGC)" prio=10 tid=0x00007fa35002b800 nid=0x36f8 runnable

    "VM Periodic Task Thread" prio=10 tid=0x00007fa3500a8800 nid=0x3700 waiting on condition

    JNI global references: 392

    从输出信息可以看出,此线程是JVM的gc线程。此时可以基本确定是内存不足或内存泄露导致gc线程持续运行,导致CPU占用过高。

    所以接下来我们要找的内存方面的问题

    3、内存问题定位

    3.1、使用jstat -gcutil命令查看进程的内存情况

    [ylp@ylp-web-01 ~]$ jstat -gcutil 14063 2000 10

    S0 S1 E O P YGC YGCT FGC FGCT GCT

    0.00 0.00 100.00 99.99 26.31 42 21.917 218 1484.830 1506.747

    0.00 0.00 100.00 99.99 26.31 42 21.917 218 1484.830 1506.747

    0.00 0.00 100.00 99.99 26.31 42 21.917 219 1496.567 1518.484

    0.00 0.00 100.00 99.99 26.31 42 21.917 219 1496.567 1518.484

    0.00 0.00 100.00 99.99 26.31 42 21.917 219 1496.567 1518.484

    0.00 0.00 100.00 99.99 26.31 42 21.917 219 1496.567 1518.484

    0.00 0.00 100.00 99.99 26.31 42 21.917 219 1496.567 1518.484

    0.00 0.00 100.00 99.99 26.31 42 21.917 220 1505.439 1527.355

    0.00 0.00 100.00 99.99 26.31 42 21.917 220 1505.439 1527.355

    0.00 0.00 100.00 99.99 26.31 42 21.917 220 1505.439 1527.355

    ```

    从输出信息可以看出,Eden区内存占用100%,Old区内存占用99.99%,Full GC的次数高达220次,并且频繁Full GC,Full GC的持续时间也特别长,平均每次Full GC耗时6.8秒(1505.439/220)。根据这些信息,基本可以确定是程序代码上出现了问题,可能存在不合理创建对象的地方

    ####3.2、分析堆栈

    使用jstat命令查看进程的堆栈情况

    [ylp@ylp-web-01 ~]$ jstat 14063 >>jstat.out

    把jstat.out文件从服务器拿到本地后,用编辑器查找带有项目目录并且线程状态是RUNABLE的相关信息,从图中可以看出ActivityUtil.java类的447行正在使用HashMap.put()方法

    8dc84fd61180e07db0e202928545a3cb.png

    3.3、代码定位

    打开项目工程,找到ActivityUtil类的477行,代码如下:

    62ae458213c3750394111ffbcb69954e.png 

    找到相关同事了解后,这段代码会从数据库中获取配置,并根据数据库中remain的值进行循环,在循环中会一直对HashMap进行put操作。

    查询数据库中的配置,发现remain的数量巨大

    6db870bb9fc070177cf76f55b1df4db0.png

    至此,问题定位完毕。

    展开全文
  • 41、java应用占用cpu过高原因分析

    千次阅读 2018-12-06 15:34:58
    线上服务器cpu占用过高问题排查 1、定位最耗cpu的进程 命令:top 2、定位最耗cpu的线程 命令:Top –Hp PID 例如:Top –Hp 12086 3、打印线程堆栈信息 命令:Printf ‘%x\n’ PID 例如:printf ‘%x\n...

    线上服务器cpu占用过高问题排查

    1、定位最耗cpu的进程

    命令:top

    2、定位最耗cpu的线程

    命令:Top –Hp PID

    例如:Top –Hp 12086

    3、打印线程堆栈信息

    命令:Printf ‘%x\n’ PID

    例如:printf ‘%x\n’ 12118

    先将线程id转成16进制显示

     

    命令:Jstack PID | grep tid –A line

    例如:jstack 12086 | grep ‘2f56’ –A 100

     

             通过堆栈信息分析代码中的问题

    展开全文
  • 转自:有赞coder作者:张云翔最近我们线上有个应用服务器有点上头,CPU总能跑到99%,我寻思着它流量也不大啊,为啥能把自己整这么累?于是我登上这台服务器,看看它到底在干啥!以前碰到类似问题,可能会考虑使用top...
  • 作者:MnameHZJmy.oschina.net/u/1420452/blog/2245304如何排查java应用CPU使用率或内存占用的问题?这类问题的排查步骤基本通用的。现在通过一个具体的例子来说明。问题描述最近有个线上项目每天0点过后CPU...
  • 转本博文的目的就算是个书签吧,需要时候可以定位原文学习1、故障现象客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现CPU占用率过高。2、CPU占用过高...
  • 1、故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现CPU占用率过高。2、CPU占用过高问题定位 2.1、定位问题进程 使用top命令查看资源占用情况,...
  • 最近我们线上有个应用服务器有点上头,CPU总能跑到99%,我寻思着它流量也不大啊,为啥能把自己整这么累?于是我登上这台服务器,看看它到底在干啥! 以前碰到类似问题,可能会考虑使用 top -Hp 加 jstack ...
  • TOP首先查看系统资源占用信息,TOP看一下发现正在运行的JAVA项目CPU占用率很,百分之200左右了,那么问题一定出在这个程序中Ps -mp pid -o THREAD,tid,time再通过ps命令查看这个程序的线程信息,tid代码线程ID,...
  • 问题现象vrs后台系统从某一时间点,根据已查结果,追溯到几个月前上线的PGC审核功能引起。近期大概一周左右运营使用时会反馈系统...1031问题分析之CPU 100%10-31日出现一次问题,服务器上执行top命令按键1观察始终...
  • 最近我们线上有个应用服务器有点上头,CPU总能跑到99%,我寻思着它流量也不大啊,为啥能把自己整这么累?于是我登上这台服务器,看看它到底在干啥! 以前碰到类似问题,可能会考虑使用top -Hp 加 jstack命令去排查,...
  • 最近生产环境经常发生CPU和内存异过高的情况,以前一般排查的也是一些死锁问题,排查死锁的时候直接打印程序的堆栈信息,然后查看线程的各种状态,差不多都能猜到问题所在,这两天cpu和内存问题刚开始也是直接打印...
  • 最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注的程序性能问题。在硬着头皮查找资料定位错误修正bug...
  • 最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注的程序性能问题。在硬着头皮查找资料定位错误修正bug...
  • 当用户量大,或服务器性能不足以支持大用户量,但同时又得不到扩容的情况下,进行性能分析,并对系统、应用、程序进行优化显得尤为重要,也是节省资源的一种必不可少的手段。目前大多数运维产品都基于JAVA语言开发...
  • 最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快排查步骤1.使用top 定位到占用CPU高的进程PIDtop2.通过ps aux | grep PID命令获取线程...
  • web应用部署到Linux服务器上,CPU占用过高公司项目部署到Linux服务器上后,过了一段时间,CPU过高,开始寻找原因有这么几步:1.通过top命令(top之后再按shift+H可以显示线程)查看CPU使用率高的线程;2.将这个线程...
  • 最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快排查步骤1.使用top 定位到占用CPU高的进程PIDtop2.通过ps aux | grep PID命令获取线程...
  • Linux服务器CPU过高

    2019-09-29 01:54:14
    服务器cpu过高时,可使用以下命令,快速导出堆栈信息,以方便查看具体的问题。 使用top命令定位异常进程。可以看见12836的CPU和内存占用率都非常 此时可以再执行ps -ef | grep java,查看所有的java进程,...
  • 记一次java程序CPU占用过高问题排查

    万次阅读 多人点赞 2017-11-29 12:57:19
    发现正在运行的JAVA项目CPU占用率很,百分之200左右了,那么问题一定出在这个程序中 Ps -mp pid -o THREAD,tid,time 再通过ps命令查看这个程序的线程信息,tid代码线程ID,time代表这个线程...
  • linux下java 进程 cpu过高问题排查

    千次阅读 2019-05-06 16:56:06
    服务器cpu过高时,可使用以下命令,快速导出堆栈信息,以方便查看具体的问题。 1. 使用top命令定位异常进程。可以看见12836的CPU和内存占用率都非常 此时可以再执行ps -ef | grep java,查看所有的java...
  • web应用部署到Linux服务器上,CPU占用过高公司项目部署到LINUX服务器上后,过了一段时间,CPU过高,开始寻找原因有这么几步: 1.通过top命令(top之后再按shift+H可以显示线程)查看CPU使用率高的线程; 2.将这个...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 172
精华内容 68
关键字:

java应用服务器cpu过高

java 订阅