我正在使用JMeter 3.1运行一些测试。其中一些测试使用JSR223 Sampler,它使用Groovy脚本来评估值并返回结果。
这些测试使用Java 8,更新112从客户端运行。
当我运行这些测试时,堆内存逐渐增加到引发Out of Memory异常和堆转储的程度。
我已经使用Java VisualVM来检查内存的进度,并且发现Loaded Classes不断增加,直到加载了100K +类。
因此,我使用-verbose:classes运行JMeter,并且有数千条关于加载“Script”类的行,如:
[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都会创建一个新的类定义,并且这些clases似乎永远不会从内存中卸载。
所有这些检查都是通过使用:
evaluate(new File("...\script.groovy"))
我自己没有完成script.groovy文件,但如果需要可以检查它。
编辑:我尝试使用一个空的groovy脚本进行全新的测试,并且类加载完全相同,因此它与脚本的内容无关。
这是JMeter 3.1中使用的groovy版本的问题。
这个版本的JMeter现在很老了,你应该升级到JMeter 5.0或5.1(从现在开始几个小时内发布),它嵌入了更新版本的Groovy,修复了这个问题。
另请参阅使用Groovy的this
当使用Groovy作为脚本语言而不检查Cache编译脚本(如果可用)时(建议使用缓存),由于Groovy内存泄漏,您应该将此JVM属性设置为-Dgroovy.use.classvalue = true。
相关链接:
如果您想了解有关性能测试和JMeter的更多信息,这款book将为您提供帮助。