使用Jmeter进行性能测试,录制Web页面脚本时,如果页面过于复杂,尤其在一些企业级应用系统中,会出现Jmeter突然崩溃,日志中抛出Java栈溢出错误。
经过排查,发现是在页面中对Form accept-charset进行计算时,采用了递归遍历的算法,当Dom树足够复杂的时候,就会使用大量的Java stack内存,由于Java Stack内存较小,不同系统默认值不一样,一般不超过2M,当然最简单的办法是通过设置-xss参数,但是设置到多大合适需要不断调试,而且设置过大导致JVM能够创建的线程数受限,不是根本解决办法。最有效的解决办法是不采用递归遍历的算法,HyperPacer中采用了非递归遍历算法解决了此问题。