1. 问题背景
项目中需要对服务程序进行比较长时间的压力测试,在经过8小时的压力测试后,开始生成报告的时候,突然出现了java.lang.OutOfMemoryError。控制台输出如下:
summary + 1336 in 00:00:34 = 39.2/s Avg: 262 Min: 46 Max: 770 Err: 0 (0.00%) Active: 1 Started: 50 Finished: 49
summary = 5219870 in 08:00:27 = 181.1/s Avg: 264 Min: 33 Max: 7204 Err: 0 (0.00%)
summary = 5219870 in 08:00:27 = 181.1/s Avg: 264 Min: 33 Max: 7204 Err: 0 (0.00%)
Tidying up ... @ Wed May 18 02:12:04 CST 2022 (1652811124103)
Uncaught Exception java.lang.OutOfMemoryError: Java heap space in thread Thread[StandardJMeterEngine,5,main]. See log file for details.
从输出信息可以看出,压力测试已经完成,也就是jtl文件已经生成,只是在根据jtl文件生成web测试报告的时候出现了内存溢出。重新执行根据jtl文件生成web报告。
./jmeter -g ./test208-8.jtl -o ./result208-8
这里根据test208-8.jtl文件,生成报告在result208-8目录下。
仍然出现内存溢出,怀疑jmeter的内存设置小了。
2. 修改jmeter内存大小
在jmeter文件中找到如下位置:
# This is the base heap size -- you may increase or decrease it to fit your
# system's memory availability:
: "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
修改为如下:
# This is the base heap size -- you may increase or decrease it to fit your
# system's memory availability:
: "${HEAP:="-Xms2g -Xmx4g -XX:MaxMetaspaceSize=256m"}"
继续执行报告转换,仍然出现内存溢出错误,继续加大内存配置如下:
# This is the base heap size -- you may increase or decrease it to fit your
# system's memory availability:
: "${HEAP:="-Xms4g -Xmx6g -XX:MaxMetaspaceSize=256m"}"
3. 重新执行转换
./jmeter -g ./test208-8.jtl -o ./result208-8
启动jmeter后,可以查看堆内存分配:
# jmap -heap 14773
Attaching to process ID 14773, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09
using thread-local object allocation.
Garbage-First (G1) GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 6442450944 (6144.0MB)
NewSize = 1363144 (1.2999954223632812MB)
MaxNewSize = 3865051136 (3686.0MB)
OldSize = 5452592 (5.1999969482421875MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 260046848 (248.0MB)
MaxMetaspaceSize = 268435456 (256.0MB)
G1HeapRegionSize = 2097152 (2.0MB)
Heap Usage:
G1 Heap:
regions = 3072
capacity = 6442450944 (6144.0MB)
used = 3205496888 (3057.0000534057617MB)
free = 3236954056 (3086.9999465942383MB)
49.755860244234405% used
G1 Young Generation:
Eden Space:
regions = 1198
capacity = 2642411520 (2520.0MB)
used = 2512388096 (2396.0MB)
free = 130023424 (124.0MB)
95.07936507936508% used
Survivor Space:
regions = 30
capacity = 62914560 (60.0MB)
used = 62914560 (60.0MB)
free = 0 (0.0MB)
100.0% used
G1 Old Generation:
regions = 304
capacity = 1589641216 (1516.0MB)
used = 630194232 (601.0000534057617MB)
free = 959446984 (914.9999465942383MB)
39.643802995103016% used
9942 interned Strings occupying 730264 bytes.
可以看到堆内存修改生效了。
这次执行报告转换成功了。
后来查看jtl文件,文件大小2GB,已经是挺大的文件了。