Java.lang.StackOverflowError由于regex.Perl5Matcher

时间:2018-09-03 16:18:01

标签: jmeter

在特定计算机上运行JMeter测试时,该问题可重现。用户数量为1。JMeter测试使用正则表达式排除某些域2018-09-03 15:53:12,596 ERROR o.a.j.JMeter: Uncaught exception: java.lang.StackOverflowError: null at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source) ~[oro-2.0.8.jar:?] at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source) ~[oro-2.0.8.jar:?] at org.apache.oro.text.regex.Perl5Matcher.__match(Unknown Source) ~[oro-2.0.8.jar:?] 。线程几乎立即关闭,jmeter日志中的错误是:

HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m

Perl5Matcher错误大约出现1000次。 由于此问题只能在我们的3个性能代理中的一个上再现,因此我不确定是什么原因引起的。 所有机器上的堆都是1GB:

this.weld = new Weld();

Java版本是1.8.0_181的所有三个代理。

您对哪里看有想法吗?

3 个答案:

答案 0 :(得分:1)

在任何地方尝试将Xss设置为相同的值:

  

-Xss256k

还请显示以下所有的jmeter.log:

  • jmeter.log
  • jmeter-server.log

答案 1 :(得分:1)

如果仅一台计算机受到影响,则意味着它与其他计算机不同,因此它可能产生与您期望的负载不同的负载,因此我将首先确定差异。

  1. 再次检查您的负载生成器运行的是同一操作系统
  2. 再次检查您的负载生成器是否使用相同的JVM版本(最好是来自Oracle,最好是server JRE或JDK),供应商,体系结构,内部版本等。
  3. 再次检查您的负载生成器是否使用相同(最好是latest)的JMeter版本
  4. 再次检查您的负载生成器是否具有相同的配置,最好的方法是根据JMeter Best Practices设置一个节点并将安装复制到所有从属计算机
  5. 保存失败请求的响应数据,并验证所有从站的响应数据是否相同,您可以通过在user.properties文件中添加以下两行来实现此目的:

    jmeter.save.saveservice.output_format=xml
    meter.save.saveservice.response_data=true
    
  6. 尝试修改正则表达式以将域排除为类似内容:

    • ^((?!somerealdomain).)*$

    • ^((?!somerealdomain.com).)*$

答案 2 :(得分:0)

我找到了解决方案。我将添加到PATH C的开头:\ Program Files \ Java \ jre1.8.0_181 \ bin;然后按照说明here重新启动计算机。

导致我这样做的原因是,在我安装了最新的Java JRE 64位版本并运行java -version之后,消息为"Java is not recognized as an internal or external command"。奇怪的是,JMeter测试甚至已经开始在此计算机上执行。

其他两个代理都不需要这样做。谢谢大家的建议。