seo查询 站长工具,yw1139com最新跳转接口p,常州网站推广软件信息,营销推广策划及渠道java 正则异常 java.lang.StackOverflowError#xff1a;在使用正则表达式的时候#xff0c;底层是通过迭代方式执行的#xff0c;每一层的迭代都会在栈线程的大小中占一定内存#xff0c;如果迭代的层次很多#xff0c;就会报出stackOverFlowError异常。所以在使用正则的…java 正则异常 java.lang.StackOverflowError在使用正则表达式的时候底层是通过迭代方式执行的每一层的迭代都会在栈线程的大小中占一定内存如果迭代的层次很多就会报出stackOverFlowError异常。所以在使用正则的时候其实是有利有弊的。我们使用的weblogic服务器修改了配置-Xss的大小为512K后测试几次没有报错。现在修改成了1M再观察一段时间。修改-Xss只是治标不治本的解决方法要从根源上解决还需要优化正则。以下是从网络上摘抄的根本原因是这样的,对于每一个线程,都有一个java栈 ,当有一个方法被调用的时候,会产生一些跟这个方法相关的信息,如方法名参数中间变量等等,这些叫做栈帧 ,当一个方法执行完毕 这个栈帧才会从栈顶pop掉 你递归的话 会一直向栈里push栈帧 而这个java栈是有一定的长度或深度的,当栈满了,无法再进行push的时候 就出现你上面的异常了,解决办法的话 就不要用递归操作 改用for 而且平时也不建议用递归的,效率太低了 .参考网址http://bbs.csdn.net/topics/370099884栈溢出了JVM依然是采用栈式的虚拟机这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。你调用构造函数的“层”太多了以致于把栈区溢出了。通常来讲一般栈区远远小于堆区的因为函数调用过程往往不会多于上千层而即便每个函数调用需要1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量)那么栈区也不过是需要1MB的空间。通常栈的大小是12MB的。通常递归也不要递归的层次过多很容易溢出.参考网址http://bbs.csdn.net/topics/380047221对java.lang.StackOverflowError的分析原因运行一个程序,JVM会开辟一块内存空间去储存程序进行时的某些信息,当程序运行时需要储存的信息超过了分配的空间,就会出现那样的问题.比如死循环,解决首先从程序代码优化方面着手检查是否有死循环、递归等程序如果有修正、优化相关代码。参考网址http://blog.csdn.net/gaomatrix/article/details/6604579有时regex包中的Pattern类会抛出StackOverflowError.这是已知的bug #5050507的表现它自从Java 1.4就存在于java.util.regex包中。这个bug仍然存在因为它是“wont fix”的状态。这个错误的出现是因为Pattern类把一个正则表达式编译为一个用来寻找匹配的小程序。这个程序被递归调用有时太多的递归就会导致该错误的出现。更多细节请参考bug描述。看起来大部分是在使用选择(alternation)的出现。参考网址http://edu.21cn.com/java/g_189_801829-1.htm大致的描述一下问题有一个正则匹配本机环境可以正常匹配在另一台服务器也可以正常匹配但是只有一台 不行我就怀疑是那台机器的环境问题结果和我想的一样。设置jvm参数Xss 设置成默认即可参考网址http://blog.knowsky.com/190676.htmJava程序中每个线程都有自己的Stack Space。这个Stack Space不是来自Heap的分配。所以Stack Space的大小不会受到-Xmx和-Xms的影响这2个JVM参数仅仅是影响Heap的大小。Stack Space用来做方法的递归调用时压入Stack Frame。所以当递归调用太深的时候就有可能耗尽Stack Space爆出StackOverflow的错误。Stack Space的大小随着OSJVM以及环境变量的大小而发生变化。一般说来默认的大小是512K。在64位的系统中这个StackSpace值会更大。一般说来Stack Space为128K是够用的。这时你说需要做的就是观察。如果你的程序没有爆出StackOverflow的错误可以使用-Xss来调整Stack Space的大小为128K。(eg-Xss128K)参考网址http://thomaschen2011.iteye.com/blog/1214114从异常信息来看很明显线程栈空间不足一般来说存在这种情况是因为方法的嵌套调用层次太深上层的方法栈一直得不到释放导致栈空间不足。因为正则匹配的时候嵌套层次太深“()”太多太深。请记住一句老话“ 您有一个问题用正则表达式解决。那您就有两个问题了。”参考网址http://www.iteye.com/topic/860654关于优化Java中的正则表达式1、如果在程序中多次使用同一个正则表达式一定要用Pattern.compile()编译代替直接使用Pattern.matches()。如果一次次对同一个正则表达式使用Pattern.matches()例如在循环中没有编译的正则表达式消耗比较大。因为matches()方法每次都会预编译使用的表达式。另外记住你可以通过调用reset()方法对不同的输入字符串重复使用Matcher对象。2、留意选择(Beware of alternation)。类似“(X|Y|Z)”的正则表达式有降低速度的坏名声所以要多留心。首先考虑选择的顺序那么要将比较常用的选择项放在前面因此它们可以较快被匹配。另外尝试提取共用模式例如将“(abcd|abef)”替换为“ab(cd|ef)”。后者匹配速度较快因为NFA会尝试匹配ab如果没有找到就不再尝试任何选择项。(在当前情况下只有两个选择项。如果有很多选择项速度将会有显著的提升。)选择的确会降低程序的速度。在我的测试中表达式“.*(abcd|efgh|ijkl).*”要比调用String.indexOf()三次——每次针对表达式中的一个选项——慢三倍。3、获取每次使用引起小损失的分组。如果你实际并不需要获取一个分组内的文本那么就使用非捕获分组。例如使用“(?:X)”代替“(X)”。参考网址http://blog.csdn.net/mydeman/article/details/1800636(大概的意思就是如果我们使用递归了首先你得明白什么是递归递归就是一个方法被调用N次。当方法被调用的时候方法的参数定义等信息会存在本次线程对应的java栈里。一个方法被调用N次那就得往这个java栈里放N次。次数如果过多那么java栈就会溢出。)