JMeter OutOfMemory 由于 groovy 个脚本创建了几个 类

JMeter OutOfMemory due to groovy scripts creating several classes

我正在 运行使用 JMeter 3.1 进行一些测试。其中一些测试使用 JSR223 采样器,该采样器使用 Groovy 脚本来评估值和 return 结果。

这些测试 运行 来自使用 Java 8,更新 112 的客户端。

当我 运行 这些测试时,堆内存逐渐增加到引发内存不足异常和堆转储的程度。

我用JavaVisualVM查看内存进度,发现Loaded类不断增加,一直到100K+classes loaded。

因此,我 运行 JMeter 使用 -verbose:classes,关于加载 "Script" classes 有数千行,例如:

[Loaded Script1 from file: /groovy/script]
[Loaded Script2 from file: /groovy/script]
[Loaded Script3 from file: /groovy/script]
[...]
[Loaded Script2409 from file: /groovy/script]

以此类推

有什么办法可以避免这种行为吗?我相信 JMeter 会在每次检查脚本时创建一个新的 class 定义,并且这些类似乎永远不会从内存中卸载。

所有这些检查都是通过使用:

evaluate(new File("...\script.groovy"))

我自己还没有完成 script.groovy 文件,但如果需要可以检查一下。

编辑:我尝试了一个全新的测试,空的 groovy 脚本和 class 加载完全相同,所以它与脚本的内容无关.

这是 JMeter 3.1 中使用的 groovy 版本的问题。

这个版本的 JMeter 现在已经很旧了,您应该升级到 JMeter 5.0 或 5.1(几个小时后发布),其中嵌入了更新版本的 Groovy,此问题已得到修复。

另请参阅 this 使用 Groovy

When using Groovy as scripting language and not checking Cache compiled script if available (while caching is recommended), you should set this JVM Property -Dgroovy.use.classvalue=true due to a Groovy Memory leak.

相关链接:

如果您想了解有关性能测试和 JMeter 的更多信息,这篇 book 会对您有所帮助。