如何在Android上触发LMK事件?优先支持程序化实现
在Android上触发低内存终止(LMK)事件的方法
当然可以触发LMK事件,以下是具体实现方式和你遇到的日志问题的解决方案:
一、程序化触发方案
在应用中主动占用大量内存,迫使系统触发LMK机制终止低优先级进程:
// 建议在子线程执行,避免阻塞主线程导致ANR new Thread(() -> { List<byte[]> memoryReservoir = new ArrayList<>(); try { while (!Thread.currentThread().isInterrupted()) { // 每次申请100MB内存,可根据设备调整大小 memoryReservoir.add(new byte[1024 * 1024 * 100]); Thread.sleep(500); } } catch (OutOfMemoryError e) { // 当前应用触发OOM时,系统大概率已经通过LMK终止了其他低优先级进程 Log.e("MemoryHog", "当前应用OOM,LMK可能已触发"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }).start();
你可以在多个测试应用中同时运行这段代码,加速内存耗尽的过程。
二、修正Logcat命令
你之前的日志命令无法捕获LMK事件,因为LMK日志默认输出在events缓冲区,而非main缓冲区。正确的命令如下:
# 仅监听events缓冲区的LMK日志 adb logcat -b events -s lowmemorykiller:* # 同时监听多个缓冲区,避免遗漏相关日志 adb logcat -b main -b system -b events -s lowmemorykiller:*
三、模拟器环境优化建议
模拟器默认分配的内存通常较高,难以触发LMK,可通过以下方式调整:
- 调低模拟器的内存配置(建议设置为512MB或1GB);
- 同时启动多个后台应用(比如浏览器、视频应用、游戏等);
- 使用
adb shell dumpsys meminfo实时查看系统内存状态,当Free内存趋近于临界值时,LMK会开始工作。
四、辅助调试工具与命令
- 用
adb shell procrank查看进程内存占用排名,LMK会优先终止内存占用高、优先级低的进程; - 可通过修改系统属性调低LMK触发阈值(不同Android版本属性名可能有差异):
# 调整后台进程的内存阈值示例 adb shell setprop ro.lmk.bg_low 100000 adb shell setprop ro.lmk.bg_high 200000
内容的提问来源于stack exchange,提问作者ir2pid
相关产品推荐
相关产品推荐

