实战-java服务cpu打满

实战记录,参考了原来自己的整理博客:  https://www.cnblogs.com/thinkqin/p/11906010.html


线上服务cpu打满报警,晚上8:00突然开始cpu打满

分析思路:

1.首先调用服务几个接口,接口有响应,且没有特别慢(100ms以内),正常业务使用系统也未受影响。判断紧急程度没有那么高。

2.怀疑是某个定时任务开启,突然的调动量增大导致,查看日志,接口调用量没有突然增加。

3.申请到服务器权限,查看

(1)top,确实是java进程占cpu   pid = XXX

(2)top   -Hp   XXX 查看有 5个线程异常,每个占20% 左右cpu  

(3)jstack  XXX > XXXstack;

(4)查看文件内容中线程为RUNABLE 且线程id 与 步骤(2)里线程对应上的线程id(16进制注意转换)。查看代码堆栈,发现都是 

j又死循环,见附录。

java的 pattern 解析问题,查看资料得知JDK pattern解析有偶发的死循环错误。对于这个问题,后续有机会再单独研究。

 (5)重启服务,cpu降下来。后续去掉复杂的pattern 校验逻辑。

 

附录

java栈

"http-nio-6210-exec-609" #140030 daemon prio=5 os_prio=0 tid=0x00007fc3716ee000 nid=0x244f runnable [0x00007fc30209e000]
java.lang.Thread.State: RUNNABLE
at java.util.regex.Pattern$Curly.match0(Pattern.java:4252)
at java.util.regex.Pattern$Curly.match(Pattern.java:4236)

at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660)
at java.util.regex.Pattern$Loop.match(Pattern.java:4787)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719)
at java.util.regex.Pattern$Ques.match(Pattern.java:4184)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4274)
at java.util.regex.Pattern$Curly.match(Pattern.java:4236)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660)
at java.util.regex.Pattern$Loop.match(Pattern.java:4787)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719)
at java.util.regex.Pattern$Ques.match(Pattern.java:4184)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4274)
at java.util.regex.Pattern$Curly.match(Pattern.java:4236)
................................

at java.util.regex.Pattern$Prolog.match(Pattern.java:4743)
at java.util.regex.Pattern$Begin.match(Pattern.java:3527)
at java.util.regex.Matcher.match(Matcher.java:1270)
at java.util.regex.Matcher.matches(Matcher.java:604)
at java.util.regex.Pattern.matches(Pattern.java:1135)

已经可以看到循环的代码了

at java.util.regex.Pattern$GroupTail.match(Pattern.java:4719)
at java.util.regex.Pattern$Ques.match(Pattern.java:4184)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4274)
at java.util.regex.Pattern$Curly.match(Pattern.java:4236)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4660)
at java.util.regex.Pattern$Loop.match(Pattern.java:4787)

 

 

正则表达式信息

Pattern.matches(REGEX_EMAIL, email)
public static final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)"
+ "+[a-zA-Z]{2,}$";

解析的字符串是 正常字符串格式,再次本机跑了几万次也没有出现死循环。

posted @ 2021-03-04 19:30  thinkqin  阅读(833)  评论(0编辑  收藏  举报