整个Xss(堆栈空间)是否用于每个Java线程?

时间:2010-12-09 20:51:37

标签: java regex stack

我正在考虑增加堆栈大小以适应StackOverflowError thrown by the regex librarydoes not appear to be on the plans for a fix

编辑:解决方案

  • Stephen C's answer可能是问题的最佳答案,即使它不是问题的答案。虽然我的字符串大小已超过4k,但在产品生命周期内我仍有可能再次出现问题
  • aioobe's answer是实际问题的最佳答案,也许不是实际问题。
  • Chris's answer是一个非常好的主意。 修改: JRegex效果很好!

4 个答案:

答案 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)

如果使用JRegexJakarta Regex呢?

答案 3 :(得分:1)

如果(x|ab)*形式的正则表达式导致正则表达式引擎中出现堆栈溢出或其他崩溃(如原始问题中的madbean.com链接所述),请执行以下提示:这样的正则表达。

正则表达式(x|ab)*由一个捕获组和两个互斥的替代组成。此正则表达式可以通过3种方式进行优化,具体取决于正则表达式支持的功能。 java.util.regex风格支持所有3。

捕获组将存储在成功匹配后最后一次迭代期间匹配的文本,即xab。由于您可能不关心上一次迭代,因此您可以告诉正则表达式引擎您不关心并使用非捕获组:(?:x|ab)*。这给出了多少速度增加取决于正则表达式引擎如何跟踪捕获组。

替代方案是互斥的。如果x匹配,则尝试在同一位置匹配ab没有意义。您可以通过使用原子组告诉正则表达式引擎:(?>x|ab)*原子组是非捕获的,因此这将保留先前的优化。

您重复的群组(?>x|ab)*后面没有任何与xab相同的文字。因此,量词*可以匹配尽可能多的迭代,而不必返回以允许正则表达式的其余部分匹配。你可以通过使用占有量词来告诉正则表达式引擎:(?>x|ab)*+

根据java.util.regex引擎如何通过原子组和占有量词来处理回溯及其抑制,这些优化中的任何一个或它们的组合都可以很好地避免堆栈溢出。即使它没有并且您选择使用不同的正则表达式引擎,这些技术仍然可以提高正则表达式的性能。