如何找到并隔离 jmeter 脚本随时间增加内存消耗的原因?

How can I find and isolate the cause for a jmeter script's increased memory consumption over time?

我创建了一个包含 2 个线程组的 JMeter 脚本。一个继续将多条消息放在 IBM MQ 队列 1 上,然后仍然在 运行 时间,另一个从另一个 IBM MQ 队列 2 获取并使用对这些消息中每条消息的响应。

目的是生成负载并测量所有消息的响应时间。为此,为了同步线程,我使用 Inter Thread Communication Plugin 将每条消息的 JMScorrelationID 从在 queue1(生产者)上运行的线程传递到在 queue2(消费者)上运行的线程。 为此,我使用带有 groovy 代码和这两个库的 JSR223 采样器:

javax.jms-api-2.0.1
com.ibm.mq.allclient-9.2.0.2

为了将消息放在 queue1 上,我主要使用这些方法:

javax.jms.Session.createProducer(destinationInboundQueue)
//code to create some text payload
javax.jms.TextMessage.createTextMessage(payload)
javax.jms.MessageProducer.send(aboveMessage)

为了使用来自 queue2 的响应消息,我主要使用这些方法:

javax.jms.Session.createConsumer(destination, "JMSCorrelationID='" + queue1MessageId + "'" )
javax.jms.MessageConsumer.receive(10000) 

起初它似乎工作正常,但问题是我 运行 脚本越长,即使给定负载不变,随着时间的推移它占用的 RAM 也越多。我可以在 Windows 任务管理器中看到这一点——“Java(TM) Platform Se binary”下的内存使用量随着时间的推移以稳定的速度增加。在某些时候,我的内存接近 90%,我认为那是开始出现错误的时候。 此外,我 运行 脚本似乎越长,Jmeter 消耗队列中目标消息所花费的时间就越多 - 这可能是内存使用量增加的副作用。 我觉得这不正常。

我查看了代码,但无法弄清楚这是什么原因。

如果有人知道,我想知道(在 Jmeter 中),我如何调试和隔离我的 groovy 脚本中导致 ram 随着时间的推移被填满的部分。

提前致谢。

听起来像是 classic memory leak, it's hard to say exactly where without seeing your full code, most probably not closed connection or an object accumulating data and not being a subject to garbage collection 或代码中的问题,导致每个线程在每次迭代时编译和 class 加载脚本。

只有profiler tool可以为您提供答案。

解决方法是 Distributed Testing

并确保遵循 JMeter Best Practices