相关文章推荐
无聊的火锅  ·  Python中正则匹配TAB及空格的小技巧_ ...·  3 周前    · 
坏坏的红金鱼  ·  python正则匹配空格 - CSDN文库·  3 周前    · 
飘逸的米饭  ·  python 正则 re模块(详细版) - ...·  3 周前    · 
月球上的菠菜  ·  Matlab:删除连续空格和标点符号的正则表 ...·  3 周前    · 
爱运动的铁链  ·  Python编程:正则表达式怎么匹配“空白” ...·  3 周前    · 
爽快的咖啡豆  ·  IBM DB2 订阅服务器 - SQL ...·  10 月前    · 
幸福的金针菇  ·  okhttp3 ...·  1 年前    · 
深情的麻辣香锅  ·  Kubernetes全栈架构师(二进制高可用 ...·  1 年前    · 
刚分手的人字拖  ·  根据关键字动态设置数据有效性下拉列表_往来·  1 年前    · 
踏实的洋葱  ·  【ELT.ZIP】OpenHarmony啃论 ...·  2 年前    · 
Code  ›  一个正则表达式导致 CPU 高的问题排查过程开发者社区
正则表达式
https://cloud.tencent.com/developer/article/1780881
长情的椅子
1 年前
付威
0 篇文章

一个正则表达式导致 CPU 高的问题排查过程

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
付威
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 老付的网络博客 > 一个正则表达式导致 CPU 高的问题排查过程

一个正则表达式导致 CPU 高的问题排查过程

作者头像
付威
发布 于 2021-01-28 12:08:10
1.5K 0
发布 于 2021-01-28 12:08:10
举报

这篇文章记录一个正则表达是导致 CPU 高的问题排查。由于无法直接使用线上的代码测试,所以我自己把代码整理了下来,具体代码如下:

public class AppMain {
	public static void main(String[] args) throws InterruptedException {
		final String regex="^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
		final String email="blog.laofu.online.fuweilao@vip.qq.com#";
		for (int i = 0; i < 1000000; i++) {
			Matcher matcher = RegexUtils.matcher(regex, email);
			matcher.find();
			Thread.sleep(10);
//			matcher.group();
}

当运行程序的时候,我们可以看到 java 的进程占用了 CPU 了 82.1% ,由于我使用的服务器是 1核+2G, 所以 load avg 占用也很高。

image-20201005230510905
image-20201005230510905

使用 top -H -p 4214 查看各个线程占用的情况

image-20201005230556871
image-20201005230556871

使用 printf '%x\n' 4217 把进程转成 16 进制值为 1079。执行 jstack 4214|grep 1079 -A 100 得到线程的堆栈信息:

"main" #1 prio=5 os_prio=0 tid=0x00007f943004c800 nid=0x1079 runnable [0x00007f9439fe0000]
   java.lang.Thread.State: RUNNABLE
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4264)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4196)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        // at java.util.regex.Pattern$Ques.match(Pattern.java:4196)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4196)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4195)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4293)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4196)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4196)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4195)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4293)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4196)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4196)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4195)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4293)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4196)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.match(Pattern.java:4799)
        at java.util.regex.Pattern$GroupTail.match(Pattern.java:4731)
        at java.util.regex.Pattern$Ques.match(Pattern.java:4196)
        at java.util.regex.Pattern$Curly.match0(Pattern.java:4286)
        at java.util.regex.Pattern$Curly.match(Pattern.java:4248)
        at java.util.regex.Pattern$GroupHead.match(Pattern.java:4672)
        at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4815)
        at java.util.regex.Pattern$Prolog.match(Pattern.java:4755)
        at java.util.regex.Pattern$Begin.match(Pattern.java:3539)
        at java.util.regex.Matcher.search(Matcher.java:1248)
        at java.util.regex.Matcher.find(Matcher.java:637)
        at org.rz.search.spider.AppMain.main(AppMain.java:13)
"VM Thread" os_prio=0 tid=0x00007f94300cc800 nid=0x1079 runnable 
 
推荐文章
无聊的火锅  ·  Python中正则匹配TAB及空格的小技巧_python正则表达式 空格
3 周前
坏坏的红金鱼  ·  python正则匹配空格 - CSDN文库
3 周前
飘逸的米饭  ·  python 正则 re模块(详细版) - 风,又奈何
3 周前
月球上的菠菜  ·  Matlab:删除连续空格和标点符号的正则表达式开发者社区
3 周前
爱运动的铁链  ·  Python编程:正则表达式怎么匹配“空白”字符-百度经验
3 周前
爽快的咖啡豆  ·  IBM DB2 订阅服务器 - SQL Server | Microsoft Learn
10 月前
幸福的金针菇  ·  okhttp3 java.io.EOFException: \n not found: limit=0 content=_okhttp not found: limit=0 content-CSDN博
1 年前
深情的麻辣香锅  ·  Kubernetes全栈架构师(二进制高可用安装k8s集群部署篇)--学习笔记 - 郑子铭 - 博客园
1 年前
刚分手的人字拖  ·  根据关键字动态设置数据有效性下拉列表_往来
1 年前
踏实的洋葱  ·  【ELT.ZIP】OpenHarmony啃论文俱乐部——多维探秘通用无损压缩-开源基础软件社区-51CTO.COM
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号