java2如何排查线上死循环

发布时间:2020-11-06 17:51:55

来源:亿速云

阅读:111

作者:Leah

本篇文章给大家分享的是有关java2如何排查线上死循环,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

排查方法,因为是线上的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的数量巨大

以上就是java2如何排查线上死循环,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

java 死循环排查_java2如何排查线上死循环相关推荐

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

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

  2. cpu飙升 死循环_java排查一个线上死循环cpu暴涨的过程分析

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

  3. java计算机毕业设计古惠农产品线上销售系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计古惠农产品线上销售系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计古惠农产品线上销售系统源码+mysql数据库+系统+lw文档+部署 本源码技术栈: 项目 ...

  4. java商城并发_一次线上商城系统高并发优化,涨姿势了~

    对于线上系统调优,它本身是个技术活,不仅需要很强的技术实战能力,很强的问题定位,问题识别,问题排查能力,还需要很丰富的调优能力. 本篇文章从实战角度,从问题识别,问题定位,问题分析,提出解决方案,实施 ...

  5. java access 不在本地_线上的java项目访问不到线上数据库,但是这个数据库我本地可以连接到,求解...

    java.lang.Exception: 数据库连接失败:Cannot create PoolableConnectionFactory (Server connection failure duri ...

  6. idea如何反编译字节码指令_美团点评:Java字节码增强技术,线上问题诊断利器...

    作者简介:泽恩,美团到店住宿业务研发团队工程师.文章转载于公众号:美团技术团队 1. 字节码 1.1 什么是字节码? Java之所以可以"一次编译,到处运行",一是因为JVM针对各 ...

  7. JAVA调用微信投放卡券——HTML5线上发券(JS-SDK接口)

    第一:需要一张微信公众平台创建好了的卡券(注意:卡券有效期和库存) 第二:获取微信 "api_ticket" 获取的接口是url="https://api.weixin. ...

  8. [附源码]java+ssm计算机毕业设计教师资格线上考试模拟系统gka9u(源码+程序+数据库+部署)

    项目运行 项目含有源码(见文末).文档.程序.数据库.配套开发软件.软件安装教程 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ E ...

  9. java 线程僵死_一次线上jboss僵死问题分析

    问题再现: 个人中心在上周四上线(2012.9.13)第一次上线,由于种种缘由,遗留了部分低级别的BUG,后于次日修复,下午4时再次上线. 当日晚上8点,运维发现user-web 五台服务器中四台jb ...

  10. 10年Java开发经验,教你解决线上频出MySQL死锁问题!实战解析

    程序员:给多少工资,干多少事 我们不是经常会看到一个关于西游记的"悖论"吗: 为什么孙悟空初期大闹天宫的时候那么厉害?因为他自己当老板,打一群天庭的打工仔. 为什么取经路上又变得不 ...

最新文章

  1. grafana监控linux,Grafana –美观、强大的可视化监控指标展示工具 | Linux大学
  2. pyecharts x轴全显示_超详细Pyecharts 1.x 教程,让你的图表动起来
  3. linux 占用cpu 脚本,消耗CPU资源的shell脚本
  4. UA MATH563 概率论的数学基础 鞅论初步8 鞅收敛定理
  5. OpenGL ARB 看来终于想通了,OpenGL SDK终于要出来了。
  6. 为什么不建议你使用实数作为 HashMap 的key?
  7. 前端学习之路之CSS (三)
  8. microsoft html help workshop_云话科技 | 奥比中光Workshop技术研讨线上沙龙
  9. lammps教程:nve/nvt/npt系综设置方法
  10. 正则表达式匹配以xx开头以xx结尾
  11. 服务器cpu对游戏的支持,还想用服务器CPU玩游戏?其实没必要,至强E3-1231 V3时代已不在...
  12. oracle 启动与停止工作,win7出现已停止工作如ie已停止工作、word停止工作等等
  13. 高德地图可视化2.0封装(飞线,圆点,热力图)
  14. 如何避免渠道商的“养卡”和“劝弃卡”行为的发生
  15. 用HTML写一个标准秒表,JavaScript写秒表
  16. Uniapp关于 Android原生插件开发案例
  17. 设计模式(三)- 责任链模式
  18. Python3 mp3音频转mav格式及ffmpeg安装
  19. 使用 nodeJs 实现 js/ts 文件翻译功能
  20. windows 消息处理

热门文章

  1. java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.mpg.ehr.humanaffairs.salaryb
  2. F5 BIG-IP 17.0.0
  3. android优酷视频黑屏,为什么优酷视频黑屏?优酷视频黑屏的原因与解决方法
  4. android开发中Fingerprint模块浅析
  5. 获取浏览器唯一标识_探讨浏览器指纹 fingerprint
  6. 华为热设计工程师待遇_【华为热设计工程师面试】华为二面--热设计工程师。-看准网...
  7. 计算机安装xp蓝屏怎么办,xp系统装win7系统蓝屏怎么办
  8. 李泉老师《卓越商务礼仪与高情商沟通》
  9. Stata:实时估计个股贝塔(beta)系数
  10. 正确使用 CDN 让你更好规避安全风险