jmeter通过脚本定时清理内存

每隔5分钟清理一次
// 检查时间间隔 def lastGC = vars.getObject("lastGCTime") ?: 0L def interval = 5 * 60 * 1000 // 5分钟 if (System.currentTimeMillis() - lastGC > interval) { // 内存统计 def runtime = Runtime.getRuntime() def usedBefore = (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024 // 执行GC System.gc() // 计算结果 def usedAfter = (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024 log.info("内存清理: 回收前=${usedBefore}MB, 回收后=${usedAfter}MB") // 更新执行时间 vars.putObject("lastGCTime", System.currentTimeMillis()) } else { log.debug("未达到GC执行间隔,跳过...") }
内存超过70%清理
import java.text.DecimalFormat // 获取内存状态 def runtime = Runtime.getRuntime() def maxMem = runtime.maxMemory() / (1024 * 1024) // 最大内存(MB) def usedBefore = (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024) // 已用内存(MB) def usagePercent = (usedBefore / maxMem) * 100 // 内存使用率(%) // 格式化输出 def df = new DecimalFormat("#.##") //log.info("执行") // 内存使用率超过阈值时触发GC if (usagePercent > 70) { log.warn("内存使用率过高 (${df.format(usagePercent)}%),触发GC...") def gcStartTime = System.currentTimeMillis() System.gc() // 显式触发垃圾回收 def gcDuration = System.currentTimeMillis() - gcStartTime // 回收后内存状态 def usedAfter = (runtime.totalMemory() - runtime.freeMemory()) / (1024 * 1024) def freedMem = usedBefore - usedAfter def newUsagePercent = (usedAfter / maxMem) * 100 // 记录详细日志 log.info(""" |====== 内存清理报告 ====== | 最大内存: ${maxMem}MB | 回收前: ${df.format(usedBefore)}MB (${df.format(usagePercent)}%) | 回收后: ${df.format(usedAfter)}MB (${df.format(newUsagePercent)}%) | 释放内存: ${df.format(freedMem)}MB | GC耗时: ${gcDuration}ms |======================== """.stripMargin()) // 将关键指标存入变量(可选) vars.put("mem_usage_before", df.format(usagePercent)) vars.put("mem_freed_MB", df.format(freedMem)) } else { log.debug("当前内存使用率: ${df.format(usagePercent)}% (<70%),跳过GC") }
JMeter 报告的内存使用率与操作系统显示的总内存使用率为什么不一致?


浙公网安备 33010602011771号