故障表现
项目实施反馈,系统生产时运行报错,数据库是Oscar数据库,故障信息如下
java.lang.StackOverflowError
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$Curly.match0(Pattern.java:4279)
at java.util.regex.Pattern$Curly.match(Pattern.java:4234)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568)
at java.util.regex.Pattern$Loop.match(Pattern.java:4794)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
at java.util.regex.Pattern$Branch.match(Pattern.java:4604)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658)
at java.util.regex.Pattern$Loop.match(Pattern.java:4785)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3798)
解决方案
1:堆栈溢出了,然后我就无脑增加了下jvm的内存,启动后还是不行。
2:本地复现了下,看了下报错信息的表现,发现存在递归调用的问题(上面的异常信息中也能体现),然后通过idea的breakpoint功能,将异常的地方打一个断点
![](https://img-blog.csdnimg.cn/img_convert/f3b945d7d326d2f9707b9ba8a3d4c9dc.png)
发现oscar驱动里会执行这样一段代码
![](https://img-blog.csdnimg.cn/img_convert/da617088904170d6de034c6e0ef35147.png)
大概的意思就是将拼接的sql(sql字段比较多,大概200个),通过正则表达式检查下,而后续正则在检测时,将sql的每个字符通过递归调用都检测一遍,大概在3000次之后,就爆出了这个异常
![](https://img-blog.csdnimg.cn/img_convert/ffd467546deef9daf05208f1e4d84fa5.png)
到这时大概就知道了,这是线程的栈内存不足了,通过Xss将栈内存扩大至2m,在现场重启后解决了这个问题
后续
1:不知道oscar的开发人员是怎么处理这个问题的,有可能在后续的版本升级中会将这个问题优化了,回头我找个最新的oscar驱动看看这边代码还在不
2:将线程的栈内存增加至2m,在线程创建过多的时候也会造成内存浪费,后续观察下,不然就减少至1m试试