我强烈推荐使用这个jmeter属性:
jmeterengine.force.system.exit=true
在这里记录此处。这些中文网页链接 链接 给了我提示。
当启动JMeter时,可以在命令行上添加-Jjmeterengine.force.system.exit=true
,或者将jmeterengine.force.system.exit=true
添加到JMETER_HOME/bin/jmeter.properties文件中。
如何确认此修复程序
使用JMeter 5.1和java版本"1.8.0_231"在MS-Win10上,我们正在使用定制版本的JMeter InfluxDB后端监听器。
在我的60秒测试运行之后从命令行(jmeter.bat -n -t plan.jtl)开始,命令行挂起并显示此输出(与op非常相似):
Tidying up ... @ Wed Jan 29 14:41:04 CST 2020 (1580330464874)
... end of run
The JVM should have exited but did not.
The following non-daemon threads are still running (DestroyJavaVM is OK):
Thread[DestroyJavaVM,5,main], stackTrace:
Thread[pool-2-thread-3,5,main], stackTrace:sun.misc.Unsafe
java.util.concurrent.locks.LockSupport
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor$Worker
java.lang.Thread
Thread[pool-2-thread-4,5,main], stackTrace:sun.misc.Unsafe
java.util.concurrent.locks.LockSupport
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor$Worker
java.lang.Thread
Thread[pool-2-thread-1,5,main], stackTrace:sun.misc.Unsafe
java.util.concurrent.locks.LockSupport
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue
java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor$Worker
java.lang.Thread
在将我的命令行修改如下后,jmeter.bat干净地退出,而不是挂起,并且所有难看的堆栈跟踪也消失了:
jmeter.bat -n -Jjmeterengine.force.system.exit=true -t plan.jtl
为确认问题是否由我们定制的
JMeter InfluxDB后端侦听器引起,我将其从.jmx中删除,并且也删除了jmeterengine.force.system.exit=true。没有挂起,没有丑陋的堆栈跟踪(实际上我喜欢堆栈跟踪)。
我还没有采取下一步措施来发现问题是与官方
JMeter InfluxDB后端侦听器有关还是与我们的定制变体有关,后者不可公开使用。
应该提到这个故事中的一个空缺。我觉得这个测试可以明确指出我们定制的后端侦听器(或者jmeter的)。然而,奇怪的是上面线程转储中似乎没有一个属于后端侦听器。所以我赞扬JMeter做了正确的事情,通过转储堆栈跟踪,很少有其他应用程序像适合故障排除时自动转储那样去做得如此周全。但在这种情况下,也许需要增强jmeter自动转储代码,因为它没有指向罪犯后端侦听器代码。Apache那边有人在听吗?
祝你好运。