一、問題原因
用JMeter壓測,有時候當模擬併發請求較大或者指令碼執行時間較長時,JMeter會停止,報OOM(記憶體溢位)錯誤。
原因是JMeter是一個純Java開發的工具,記憶體由java虛擬機器JVM管理,當記憶體回收不及時,堆記憶體不足時,就會報記憶體溢錯誤。
概念補充:
記憶體洩露:應用使用資源之後沒有及時釋放,導致應用記憶體中持有了不需要的資源。
記憶體溢位:應用的記憶體已經不能滿足正常使用了,堆疊已經達到系統設定的最大值,進而導致崩潰。
通常都是由於記憶體洩露導致堆疊記憶體不斷增大,從而引發記憶體溢位。
對JMeter而言也是如此,JMeter測試過程中,如果記憶體溢位的話,一般會出現上圖中的提示:java.lang.OutOfMemoryError: Java heap space:意思就是堆記憶體溢位,不夠用了
二、解決方法
知道了報錯出現的原因是因為堆記憶體大小不足引起的,自然而然就會想到記憶體溢位的解決方法:調整堆記憶體大小。
步驟(以Windows系統為例,Linux系統類似):
1、開啟jmeter.bat檔案,按關鍵字“HEAP”搜尋,把原來的配置改為如下:
修改前:
if not defined HEAP ( rem See the unix startup file for the rationale of the following parameters, rem including some tuning recommendations set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m )
修改後:
if not defined HEAP ( rem See the unix startup file for the rationale of the following parameters, rem including some tuning recommendations set HEAP=-Xms512m -Xmx4000m set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m )
修改語句如下:
set HEAP=-Xms512m -Xmx4000m:調整堆記憶體的大小 set NEW=-XX:NewSize=256m -XX:MaxNewSize=512m:調整堆記憶體中新生帶的大小
注意:
這個值不是越大越好,要根據壓測使用的機器而定,一般而言,堆記憶體的最大值不要超過實體記憶體的一半,否則容易導致jmeter執行變慢、
卡頓甚至記憶體溢位(因為java本身的垃圾回收機制是動態分配記憶體,調整的時候其本身會佔用很多記憶體),NEW分配的記憶體,不宜太大。
2、修改完成後儲存,重啟JMeter,即可生效。
三、小結
1、這種修改堆大小的方法只適用一部分情況,並不是萬能的,當需要模擬的執行緒數較大時,就需要根據具體情況採用分散式壓測的方式了。
2、命令列執行JMeter時,一定要禁用“檢視結果樹”、“聚合報告”等監聽器,因為真的真的真的很消耗記憶體。