JMeter內存溢出:java.lang.OutOfMemoryError: Java heap space解決方法(實測有效)


一、問題原因

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM