Jmeter記憶體溢位:java.lang.OutOfMemoryError: Java heap space解決思路

风吹稻香發表於2024-05-05

一、問題原因

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時,一定要禁用“檢視結果樹”、“聚合報告”等監聽器,因為真的真的真的很消耗記憶體。

相關文章