实战-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,}$";
解析的字符串是 正常字符串格式,再次本机跑了几万次也没有出现死循环。