问题,打一个页面cpu暴涨,打开一次就涨100%,一会系统就卡的不行了。

排查方法,因为是线上的linux,没有用jvm监控工具rim链接上去。

只好用命令排查:

top cpu排序,一个java进程cpu到500%了,什么鬼.....

查到对应java进程

jps || ps -aux | grep 端口

pid=13455

查看进程中线程使用情况 T排序 查看cpu占用time最高的线程编号

top -Hp 13455

有个线程9877 的时间一直在爆涨

获取线程十六进制地址9877 (十六进制一定要小写)

printf "%x\n" 9877

执行 jstack 13455|grep -10 2695(线程十六进制号)

如果想查看完整信息,可导出文本,查找

jstack -l 9839 > jstack.log-9893

"qtp750044075-25" #25 prio=5 os_prio=0 tid=0x00007f83354e5000 nid=0x2695 runnable [0x00007f830e5d8000]

java.lang.Thread.State: RUNNABLE

at java.text.DateFormatSymbols.(DateFormatSymbols.java:145)

at sun.util.locale.provider.DateFormatSymbolsProviderImpl.getInstance(DateFormatSymbolsProviderImpl.java:85)

at java.text.DateFormatSymbols.getProviderInstance(DateFormatSymbols.java:364)

at java.text.DateFormatSymbols.getInstance(DateFormatSymbols.java:340)

at java.util.Calendar.getDisplayName(Calendar.java:2110)

at java.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:1125)

at java.text.SimpleDateFormat.format(SimpleDateFormat.java:966)

at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936)

at java.text.DateFormat.format(DateFormat.java:345)

at com.huiwan.gdata.modules.gdata.util.TimeUtil.getDay(TimeUtil.java:383)

at com.huiwan.gdata.modules.gdata.publ.retain.service.impl.Retain3ServiceImpl.act(Retain3ServiceImpl.java:119)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:498)

at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)

.......略

Locked ownable synchronizers:

- None

定住到

Retain3ServiceImpl.java:119

这行,马的,有人写了个while循环,用字符串时间比较,之前表是date类型,后改为datetime类型,多了00:00:00永远也没一样的时间,一直在那while.....还搞了个json对象默认加0......

改了这里的代码,就好了,cpu就没上去了.

补充知识:记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

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

从输出信息可以看出,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、分析堆栈

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

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

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

3.3、代码定位

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

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

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

至此,问题定位完毕。

以上这篇java排查一个线上死循环cpu暴涨的过程分析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持随便开发网。

cpu飙升 死循环_java排查一个线上死循环cpu暴涨的过程分析相关推荐

  1. java线程堆栈nid.tid_java排查一个线上死循环cpu暴涨的过程分析

    问题,打一个页面cpu暴涨,打开一次就涨100%,一会系统就卡的不行了. 排查方法,因为是线上的linux,没有用jvm监控工具rim链接上去. 只好用命令排查: top cpu排序,一个java进程 ...

  2. window服务器cpu过高的排查_线上服务器发生CPU占用率过高应该如何排查并定位问题?...

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

  3. 服务器cpu占用率高怎么解决,线上服务器CPU占用率高怎么办?

    如果线上服务器发生CPU占用率高时,应该如何排查并定位问题. 1.问题发现 本文整理自一个真实的案例,是楼主负责的业务,在一次大促之前的压测时发现了这个问题. 在每次大促之前,我们的测试人员都会对网站 ...

  4. load average多少是正常_对 cpu 与 load 的理解及线上问题处理思路解读

    (给ImportNew加星标,提高Java技能) 转自:五月的仓颉 前言 2019双11还有几天就要到来了,大家也都知道服务器在大促期间由于流量的增加势必导致机器的cpu与load变高.因此趁着这个时 ...

  5. 原创|面试官:线上服务器CPU占用率高如何排查定位问题?

    国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...

  6. 服务器定位cpu高占用率代码php,面试官:线上服务器CPU占用率高如何排查定位问题?,...

    面试官:线上服务器CPU占用率高如何排查定位问题?, 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果 ...

  7. 面试官:线上服务器CPU占用率高如何排查定位问题?

    开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...

  8. 线上服务器CPU占用率高如何排查定位问题?

    (关联着看看这篇文章:https://blog.csdn.net/u011277123/article/details/103768939) 解决问题的能力以超高比例排名第一,这也是为什么很多面试过程 ...

  9. 我们有一个线上的项目,刚启动完就占用了超过 1.5G,一次大量 JVM Native 内存泄露的排查分析(64M 问题)

    我们有一个线上的项目,刚启动完就占用了使用 top 命令查看 RES 占用了超过 1.5G,这明显不合理,于是进行了一些分析找到了根本的原因,下面是完整的分析过程,希望对你有所帮助. 会涉及到下面这些 ...

最新文章

  1. matlab中clc,close,close all,clear,clear all作用区别
  2. php oauth2.0 实例,详解laravel passport OAuth2.0的4种模式
  3. 开始ubuntu 14.04 的装X模式---终端模式下中文输入,听歌,上irc 开启framebuffer看电影 截图...
  4. 【汇编语言】王爽第六章程序6.3解答,8086汇编语言实现数据的倒序存放
  5. 我的 11 年编程生涯
  6. golang python扩展_Python 利用Go语言编写 CPython 扩展 goPy的简单示例
  7. 手把手教你做一个Excel 2007数据透视表(有图有真相)
  8. vs 2019怎么运行单个的cpp文件以及报错main已存在解决方法
  9. 宏碁服务器u盘装系统,宏基u盘装系统教程图解
  10. Android 质量优化工具 Booster实践
  11. canvas入门级基本用法实现雨滴下落特效
  12. 今生,只想做一个平凡的人
  13. 揭开 BAT 的人工智能版图
  14. iOS——directory not found for option 链接错误
  15. 外汇天眼:央行人民币降息意味着什么?有什么影响?
  16. 1.MySQL数据库 2.SQL语句
  17. php调用接口及编写接口
  18. 工作簿(Workbook)基本操作应用示例
  19. navicat连接mysql1044_Navicat访问MySQL出现1044/1045错误的解决方法
  20. 整数大小比较(YZOJ-1034)

热门文章

  1. CSDN的Markdown编辑器的使用
  2. Codeforces Round #490 (Div. 3)【完结】
  3. 2021暑假每日一题 【week6 完结】
  4. 项目: 打字母游戏【c++/c】
  5. mysql between and的用法的意思_从入门到入土:MySQL完整学习指南,包教包会!
  6. 高并发和分布式中的幂等处理
  7. 求求你不要手写redis 缓存set,get
  8. 你的 GitHub 代码已打包运往北极,传给 1000 年后人类
  9. SpringMVC+RestFul详细示例实战教程(实现跨域访问)
  10. 数据结构:线性表(java实现)