Используется ли весь Xss (пространство стека) для каждого потока Java? - PullRequest
7 голосов
/ 09 декабря 2010

Я рассматриваю возможность увеличения размера стека для обхода StackOverflowError, выдаваемого библиотекой регулярных выражений , который , по-видимому, не входит в планы исправления .

Редактировать: Решение

  • Ответ Стивена С. , вероятно, является лучшим ответом на проблему, даже если он не является ответом на вопрос.Несмотря на то, что мой размер строки уже превышал 4 КБ, у меня все еще была вероятность, что со временем проблема снова возникнет в течение срока службы продукта.
  • Ответ aioobe - лучший ответ на вопрос, возможно,не настоящая проблема.
  • Ответ Криса - очень хорошая идея. Редактировать: JRegex отлично работал!

Ответы [ 4 ]

5 голосов
/ 10 декабря 2010

Используется ли весь Xss (пространство стека) для каждого потока Java?

Согласно этой странице , да :

  • увеличить размер стека для всех потоков в вашем приложении, включив -Xssnnm в командную строку Java (где nn - количество мегабайт стекового пространства на поток);

Однако вы можете выбрать больший размер стека для определенного потока, используя конструктор Thread(ThreadGroup group, Runnable target, String name, long stackSize).

Выделяет новый объект Thread, чтобы в качестве объекта выполнения он имел цель, имел указанное имя в качестве имени, принадлежал к группе потоков, на которую ссылается группа, и имел указанный размер стека.

Обратите внимание, что (в соответствии с документацией) эффект параметра stackSize, если таковой имеется, сильно зависит от платформы и что значение параметра stackSize может не иметь никакого эффекта на некоторых платформах.

2 голосов
/ 10 декабря 2010

Я думаю, что лучшим решением было бы переписать регулярное выражение, чтобы избежать проблемы. Или, что еще лучше, замените его каким-нибудь простым Java-кодом. Или просто отклонить строки больше определенной длины.

Увеличение размера стека только устраняет проблему. Теперь вы можете справиться с 2000 или 4000 символьными строками ввода вместо 1000. Но рано или поздно вы, вероятно, столкнетесь с тем, что приведет к переполнению расширенных стеков.

1 голос
/ 02 февраля 2011

Если регулярное выражение в форме (x|ab)* вызывает переполнение стека или другие сбои в вашем механизме регулярных выражений (как упомянуто в ссылке madbean.com в исходном вопросе), вот несколько советовпереписать такое регулярное выражение.

Регулярное выражение (x|ab)* состоит из группы захвата с двумя альтернативами, которые являются взаимоисключающими.Это регулярное выражение может быть оптимизировано тремя способами, в зависимости от функций, поддерживаемых вашим регулярным выражением.Аромат java.util.regex поддерживает все 3.

Группа захвата будет сохранять текст, найденный во время последней итерации после успешного совпадения, или x или ab.Поскольку вам, вероятно, наплевать на последнюю итерацию, вы можете сказать движку регулярных выражений, что вам все равно, и использовать группу без захвата: (?:x|ab)*.Степень увеличения скорости зависит от того, как механизм регулярных выражений отслеживает группы захвата.

Альтернативы являются взаимоисключающими.Если x совпадает, нет смысла пытаться сопоставить ab в той же позиции.Вы можете указать обработчику регулярных выражений, что с помощью атомарной группы: (?>x|ab)* Атомные группы не захватываются, поэтому это сохраняет предыдущую оптимизацию.

За вашей повторной группой (?>x|ab)* не следует ничего, что могло бы соответствоватьтот же текст, что и x или ab.Таким образом, квантификатор * может соответствовать как можно большему числу итераций, без необходимости возвращать, чтобы остальная часть регулярного выражения соответствовала.Вы можете указать обработчику регулярных выражений, что с помощью собственнического квантификатора: (?>x|ab)*+

В зависимости от того, как движок java.util.regex обрабатывает возврат и подавление его с помощью атомарных групп и притяжательных квантификаторов, любой из этих оптимизаций илиих комбинация вполне может избежать переполнения стека.Даже если этого не произойдет, и вы решите использовать другой механизм регулярных выражений, эти методы все равно могут повысить производительность ваших регулярных выражений.

1 голос
/ 10 декабря 2010

А как насчет использования JRegex или Jakarta Regex вместо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...