java排查一个线上死循环cpu暴涨的过程

问题,打一个页面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

java排查一个线上死循环cpu暴涨的过程_第1张图片

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

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


你可能感兴趣的:(java,jvm)