设为首页 加入收藏

TOP

Java正则达式引起死循环问题解决办法
2014-11-24 13:02:35 来源: 作者: 【 】 浏览:0
Tags:Java 正则 引起 循环 问题 解决 办法

最近线上应用一直LOAD值非常高,几乎接近宕机的边缘,开始报异常如下:



通过异常信息抓取定位到我们的一个工具方法:该工具方法如下:



没有任何地方是通过循环的调用本方法的,但根据异常信息很明显是死循环,这就引起我们进一步去跟踪问题,通过一段时间的测试和总结,终于找到问题的产生原因。该方法允许传一个正则表达式进去, 问题就出在传入的正则表达式上,该表达式简化为如下:



通过测试发现,此时若输入的字符串里面匹配次数超过817次以后,该方法将变的不稳定,开始重现我们前面的异常信息。测试代码如下:




原来:该问题是JDK的BUG,到JDK1.6里居然还没修复,BUG详情见:


http://bugs.sun.com/bugdatabase/view_bug.do bug_id=5050507 http://bugs.sun.com/bugdatabase/view_bug.do bug_id=6988218


通过上面方法解决上抛异常问题,修改完机器重启后发现异常是不抛了,但CPU占用率高并没有好转,频频报警,经过仔细排查,有五个处理正则的线程把CPU资源耗完了,实在没招,最后校验采用其它方法,彻底干掉正则。


总结:通过这次线上问题排查,正则表达式是个双仞剑,如果大规模数据的校验最好不要使用正则,效率非常差。CPU的处理能力会全部耗费在处理这几个正则上。另外该问题是项目上线一段时间后才出现,这说明当数据达到一个数量级后,正则的处理效率会快速下降,这样就像我这种情况,刚开始数据量小,一直没有问题,等到访问量突然 大后,CPU在短时间内LOAD值非常高。所以正则轻易不要用在大数据量或者并发访问较高的应用中。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java 图片格式转换(包括bmp-->.. 下一篇Java 正则表达式

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Announcing October (2025-12-24 15:18:16)
·MySQL有什么推荐的学 (2025-12-24 15:18:13)
·到底应该用MySQL还是 (2025-12-24 15:18:11)
·进入Linux世界大门的 (2025-12-24 14:51:47)
·Download Linux | Li (2025-12-24 14:51:44)