JVM应该已经退出,但没有

时间:2018-01-08 02:33:15

标签: jmeter

在非gui模式和远程测试中使用JMeter执行脚本时我收到错误消息,如何解决问题

summary =      0 in 00:00:00 = ******/s Avg:     0 Min: 9223372036854775807 Max:
 -9223372036854775808 Err:     0 (0.00%)
Tidying up remote @ Sun Jan 07 21:00:11 EST 2018 (1515376811888)
... end of run
The JVM should have exitted but did not.
The following non-daemon threads are still running (DestroyJavaVM is OK):
Thread[Thread-5,5,main], stackTrace:java.net.DualStackPlainSocketImpl#accept0
java.net.DualStackPlainSocketImpl#socketAccept at line:131
java.net.AbstractPlainSocketImpl#accept at line:409
java.net.PlainSocketImpl#accept at line:199
java.net.ServerSocket#implAccept at line:545
java.net.ServerSocket#accept at line:513
bsh.util.Sessiond#run at line:71
java.lang.Thread#run at line:748

Thread[DestroyJavaVM,5,main], stackTrace:
Thread[Thread-3,5,main], stackTrace:java.net.DualStackPlainSocketImpl#accept0
java.net.DualStackPlainSocketImpl#socketAccept at line:131
java.net.AbstractPlainSocketImpl#accept at line:409
java.net.PlainSocketImpl#accept at line:199
java.net.ServerSocket#implAccept at line:545
java.net.ServerSocket#accept at line:513
bsh.util.Httpd#run at line:70
java.lang.Thread#run at line:748

5 个答案:

答案 0 :(得分:1)

根据此根堆栈跟踪,您似乎有自定义代码或某些插件无法正确处理退出:

  

bsh.util.Httpd#run at line:70

请检查此脚本或报告错误。

答案 1 :(得分:0)

异常来自守护程序线程,如here所述:

  

JMeter将退出它启动的所有非守护程序线程,但有些非守护程序线程可能仍然存在;这些将阻止JVM退出。为了检测这种情况,JMeter在它退出之前就启动了一个新的守护程序线程。这个守护程序线程等了一会儿;如果它从等待返回,那么很明显JVM无法退出,并且线程会打印一条消息来说明原因。

从异常详细信息中可以看出,您有一些套接字连接。这些可能是HTTP Samplers,其他一些打开套接字或自定义脚本的采样器。默认情况下,守护程序线程等待2秒,因此如果任何采样器的超时时间更长,则守护程序可能需要等待更长时间(或者您需要缩短超时时间)。

所以:

  1. 检查您的脚本并找出采样器的超时时间。将它们设置为数字< 2秒,或将jmeter.properties中的以下设置更改为高于最大超时值:

    jmeter.exit.check.pause=...
    

    例如,如果您的采样器配置为等待30秒,请将此值设置为32秒。

  2. 如果没有帮助,可能是底层库中存在一些错误。在这种情况下,你无法真正解决它,但你可以使用一个相当残酷的解决方法:

      

    如果属性jmeterengine.stopfail.system.exit设置为true(默认为false),则JMeter将调用System.exit(1),如果它无法停止所有线程。通常这不是必要的。

    因此,如here所述,将以下属性设置为true

    jmeterengine.stopfail.system.exit=true
    

    正如帮助所说,通常没有必要,但如果线程确实卡住了,那就没有多少选择了。

答案 2 :(得分:0)

我现在遇到相同的问题(我使用的是jmeter 4.0版),解决方案是在jmeter.properties上禁用beanshell服务器。

只需评论文件beanshell.server.port=9000中的jmeter.properties

答案 3 :(得分:-1)

您的JMeter很可能过载,即您试图在硬件规格较低的机器上启动太多线程,或者您没有正确调整JMeter以获得高负载或两者兼而有之。

  1. 确保您关注JMeter Best Practices
  2. 确保您遵循运行User Manual
  3. 的负载测试的建议
  4. 设置对基本操作系统级别运行状况指标(CPU,RAM,交换,磁盘和网络使用情况)的监控。现代操作系统通常带有一组实用程序,或者您可以使用JMeter PerfMon Plugin,这样您就可以将主要性能指标与资源利用率相关联。 JMeter必须有足够的空间来运行,好像JMeter无法以足够快的速度发送请求您将无法执行计划的负载

答案 4 :(得分:-1)

我在主节点和从节点上都运行Bean Shell服务器的分布式设置中遇到了此错误,其中每个节点都使用https://jmeter.apache.org/usermanual/best-practices.html#beanshell_server使用相同的jmeter.properties配置:

beanshell.server.port=9000
beanshell.server.file=../extras/startup.bsh

从主节点jmeter.properties中删除这些行后,错误消失了。