由于本人在使用IDEA的时候发现,在进行应用编码运行打包的时候时常会出现内存占用超过IDEA本身的使用,这个非常的不合理,因此苦苦寻觅发现
RAMMap
可以完美解决这个问题
RAMMap
的清理量是非常夸张。本人设备64G内存在百分之70占用时,几乎每次都可以清理10G甚至30G的占用
软件版本: RAMMap v1.61
- 佬友们可以通过官方链接获得这个应用
- 在标题栏可以找到
Empty
即可清理,下放是一些功能介绍- Empty Working Sets
清理工作页
- Empty System Working Set
清理系统工作页
- Empty Modified Page List
清理修改页
- Empty Standby List
清理备用页
- Empty Priority 0 Standby List
清理优先级为0的备用页
- Empty Working Sets
但直接使用软件并不方便,一般只有在发现设备无法正常响应操作的时候才会关注一次内存占用情况
因此我发现可以使用命令行执行操作内存清理
使用案例:RAMMap.exe -ew
- 在标题栏可以找到
Help
→Usage
即可查看命令,下放是一些功能介绍- -Ew Empty Working Sets
清理工作页
- -Es Empty System Working Sets
清理系统工作页
- -Em Empty Modifed Page List
清理修改页
- -Et Empty Standby List
清理备用页
- -E0 Empty Priority 0 standby List
清理优先级为0的备用页
- -Ew Empty Working Sets
由于
RAMMap
命令拆分过多,逐个执行非常的繁琐
因此捣鼓了一个脚本来简化这个操作
脚本编码:GBK
RAMMap.bat
@echo off
rem 强制使用GBK编码,避免win脚本运行问题
chcp 936 >nul
setlocal enabledelayedexpansion
rem 定义RAMMAP路径
set RAMMAP_PATH="RAMMap.exe"
rem 入口
goto :Menu
:Menu
echo 正在启动RAMMap内存清理...
rem 清理工作页
%RAMMAP_PATH% -ew
rem 清理系统工作页
%RAMMAP_PATH% -es
rem 清理修改页(无特殊必要不清理,容易导致应用奔溃)
:: %RAMMAP_PATH% -em
rem 清理工作页后,进行停顿10秒再执行备用页(主要是工作页清理后一段时间内会大量增加备用页占用,需等待备用页增量一定时间后清理,会得到较好的内存释放)
timeout /t 10 /nobreak
rem 清理备用页
goto :EmptyEtandby
rem 清理备用页及清理优先级为0的备用页
:EmptyEtandby
echo 正在清理备用页...
:: 清理备用页
%RAMMAP_PATH% -et
:: 清理优先级为0的备用页
%RAMMAP_PATH% -e0
rem 清理工作页后,进行停顿
echo RAMMap内存清理已完成
使用一段时间发现,软件可以用脚本执行合理清理内存,但还是需要手动执行操作非常繁琐,影响优雅的编码过程
因此我在这个脚本之上又捣鼓一个新的脚本,轮询一分钟检查内存占用是否达到阈值,然后套娃操作清理内存
脚本编码:GBK
Poller.bat
@echo off
rem 强制使用GBK编码,避免win脚本运行问题
chcp 936 >nul
setlocal enabledelayedexpansion
rem 设置内存使用阈值(单位为MB)
set threshold=40000
rem 设置检查间隔时间(单位为秒)
set checkInterval=60
rem 定时轮询检查
:loop
rem 递增循环计数器
set /a loopCount+=1
rem 获取空闲内存
for /f "tokens=2 delims==" %%a in ('wmic os get FreePhysicalMemory /value') do (
if not "%%a"=="" set freeMemoryKB=%%a
)
set /a freeMemory=!freeMemoryKB! / 1024
rem 获取总内存
for /f "tokens=2 delims==" %%a in ('wmic os get TotalVisibleMemorySize /value') do (
if not "%%a"=="" set totalMemoryKB=%%a
)
set /a totalMemory=!totalMemoryKB! / 1024
rem 计算已使用的内存
set /a usedMemory=!totalMemory! - !freeMemory!
cls
echo 循环次数: !loopCount! 次
echo 总内存: !totalMemory! MB
echo 剩余内存: !freeMemory! MB
echo 已使用: !usedMemory! MB
rem 判断是否清理
if !usedMemory! geq !threshold! (
rem 替换下面一行为实际的清理命令或脚本
call RAMMap.bat
)
rem 延迟执行
timeout /t !checkInterval! /nobreak >nul
goto loop
- 使用可将
RAMMap.exe
、RAMMap.bat
、Poller.bat
放置在同一个目录中
- 只执行
Poller.bat
即可
可能会有佬友会问我为什么不用
任务计划程序
,那是因为任务计划程序
的触发器只能按天或者按日志。也许也是我不会配置,达不到我想要的效果
佬们如果觉得还阔以,望点点赞哈~
佬们如果还有更好的方案,也可以回复补充一下~