我正在考虑增加堆栈大小以适应StackOverflowError thrown by the regex library的does not appear to be on the plans for a fix。
答案 0 :(得分:5)
每个Java线程都使用整个Xss(堆栈空间)吗?
根据this page,是:
- 通过在Java命令行中包含-Xssnnm来增加应用程序中所有线程的堆栈大小(其中nn是每个线程的堆栈空间的兆字节数);
但是,您可以使用Thread(ThreadGroup group, Runnable target, String name, long stackSize)
构造函数为特定线程选择更大的堆栈大小。
分配一个新的Thread对象,使其具有target作为其运行对象,具有指定的名称作为其名称,属于group引用的线程组,并具有指定的堆栈大小。
但请注意(根据文档)stackSize
参数的效果(如果有)与平台高度相关,并且stackSize
参数的值可能对某些平台无任何影响。
答案 1 :(得分:2)
我认为更好的解决方案是重写正则表达式以避免问题。或者更好的是,用一些普通的Java解析代码替换它。或者只是拒绝大于一定长度的字符串。
碰撞堆栈大小只能解决问题。现在你可以处理2000或4000个字符输入字符串而不是1000.但是迟早你可能遇到导致扩展堆栈溢出的字符串。
答案 2 :(得分:1)
如果使用JRegex或Jakarta Regex呢?
答案 3 :(得分:1)
如果(x|ab)*
形式的正则表达式导致正则表达式引擎中出现堆栈溢出或其他崩溃(如原始问题中的madbean.com链接所述),请执行以下提示:这样的正则表达。
正则表达式(x|ab)*
由一个捕获组和两个互斥的替代组成。此正则表达式可以通过3种方式进行优化,具体取决于正则表达式支持的功能。 java.util.regex风格支持所有3。
捕获组将存储在成功匹配后最后一次迭代期间匹配的文本,即x
或ab
。由于您可能不关心上一次迭代,因此您可以告诉正则表达式引擎您不关心并使用非捕获组:(?:x|ab)*
。这给出了多少速度增加取决于正则表达式引擎如何跟踪捕获组。
替代方案是互斥的。如果x
匹配,则尝试在同一位置匹配ab
没有意义。您可以通过使用原子组告诉正则表达式引擎:(?>x|ab)*
原子组是非捕获的,因此这将保留先前的优化。
您重复的群组(?>x|ab)*
后面没有任何与x
或ab
相同的文字。因此,量词*
可以匹配尽可能多的迭代,而不必返回以允许正则表达式的其余部分匹配。你可以通过使用占有量词来告诉正则表达式引擎:(?>x|ab)*+
根据java.util.regex引擎如何通过原子组和占有量词来处理回溯及其抑制,这些优化中的任何一个或它们的组合都可以很好地避免堆栈溢出。即使它没有并且您选择使用不同的正则表达式引擎,这些技术仍然可以提高正则表达式的性能。