一、問題原因
用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時,一定要禁用“查看結果樹”、“聚合報告”等監聽器,因為真的真的真的很消耗內存。