为什么Monosnap会冻结您的电脑以及如何修复它
您正在工作会话中 — IDE 打开,浏览器有二十个标签页,Slack 正在运行,可能还有 Docker 在后台。您的电脑开始卡顿。鼠标停顿。应用程序需要五秒钟才能响应。您打开任务管理器,然后看到了:Monosnap 正在使用 800 MB、1.2 GB,有时甚至超过 2 GB 的内存。
这不是您报告并期望修复的错误。这是一个源于 Monosnap 架构的系统性问题。用户多年来一直报告此问题,但它尚未解决,因为根本原因在于 Monosnap 的构建方式。
本文解释了它发生的原因、如何诊断、临时解决方案,以及 — 当您受够了时 — 永久修复方法。
根本原因:Electron 和内存泄漏
Monosnap 基于 Electron 构建,Electron 是一个通过捆绑 Chromium(Chrome 背后的引擎)和 Node.js 将 Web 应用程序作为桌面应用程序运行的框架。每个 Electron 应用程序本质上都在后台运行一个 Web 浏览器,这就是为什么 Electron 应用程序往往比原生应用程序消耗更多资源的原因。
Electron 本身并非必然导致内存泄漏 — 精心构建的 Electron 应用程序能有效管理内存。但 Electron 使内存泄漏更容易引入且更难检测。JavaScript 的垃圾回收、Chromium 的渲染管道和 Node.js 的事件循环相结合,产生了多个可能发生内存泄漏的表面。
就 Monosnap 而言,用户报告和系统分析显示出几种已报告的泄漏模式:
图像缓冲区累积
Monosnap 捕获的每个截图都作为图像缓冲区存在于内存中。在一个良好实现的工具中,这些缓冲区在图像保存或上传后会被释放。在 Monosnap 中,用户报告表明,来自先前捕获的图像缓冲区并未完全释放,导致内存随着每次截图而增长。在一个会话中截取 50 张图,您就会有 50 个部分保留的图像缓冲区占用内存。
渲染器进程膨胀
Electron 应用程序使用渲染器进程(本质上是 Chrome 标签页)来构建其用户界面。Monosnap 的编辑器、预览和设置窗口都作为渲染器进程运行。如果这些进程在窗口关闭时未能正确清理,其内存分配将持续存在。在多次打开和关闭编辑器的长时间会话中,这会导致内存累积。
事件监听器泄漏
已注册但从未注销的 JavaScript 事件监听器是 Electron 应用程序中内存泄漏的经典来源。每个监听器都持有一个引用,阻止垃圾回收器释放相关内存。在一个持续监听全局 hotkeys、clipboard 变化和显示事件的工具中,即使是微小的监听器泄漏也会随着时间的推移而累积。
如何诊断问题
如果您怀疑 Monosnap 导致您的系统变慢,请按以下步骤确认:
任务管理器检查
- 按下
Ctrl+Shift+Esc以打开 Task Manager - 如果看到简化视图,请点击“更多详细信息”
- 点击“Memory”列标题以按 RAM 使用量排序
- 查找“Monosnap”条目 — 可能有多个(每个 Electron 进程一个)
- 记下所有 Monosnap 进程的总内存
截图工具的正常空闲内存为 30-60 MB。如果 Monosnap 的总内存超过 300 MB,则存在泄漏。超过 500 MB 则情况严重。超过 1 GB 则会主动降低您的系统性能。
资源监视器深度分析
要获取更多详细信息,请打开 Resource Monitor(resmon 从“运行”对话框):
- 转到“Memory”选项卡
- 查找 Monosnap 进程
- 检查“Working Set”(实际使用的物理 RAM)和“Private”(Monosnap 独占的内存)
- 在正常使用 30 分钟内观察这些值 — 如果它们在您没有截图的情况下持续上升,则确认存在泄漏
临时解决方案
这些变通方法可以管理症状。它们不能修复根本的泄漏。
定期重启 Monosnap
最简单的变通方法。右键点击 Monosnap 的系统托盘图标,退出,然后重新启动。这会清除所有累积的内存。一些用户设置了 Windows Task Scheduler 任务,每隔几小时重启 Monosnap。
禁用云同步
Monosnap 的云同步功能会在内存中保留额外的连接和数据。如果您不使用云存储,请在“设置”中禁用它。这不会消除泄漏,但可能会降低内存增长的速度。
减少后台活动
禁用您不使用的功能:clipboard 监控、自动捕获、集成插件。每个活动功能都会增加事件监听器和可能泄漏的后台进程。
使用 Windows 设置内存限制
您可以创建一个脚本,监控 Monosnap 的内存使用情况,并在其超过阈值时自动重启它:
# PowerShell script — save as restart-monosnap.ps1
$threshold = 500MB
$process = Get-Process -Name "Monosnap" -ErrorAction SilentlyContinue
if ($process -and ($process.WorkingSet64 -gt $threshold)) {
Stop-Process -Name "Monosnap" -Force
Start-Sleep -Seconds 2
Start-Process "C:\Program Files\Monosnap\Monosnap.exe"
} 通过任务计划程序安排此任务每小时运行一次。这是一个权宜之计,但很有效。
永久解决方案:切换到原生工具
解决基于 Electron 的内存泄漏的永久方法是停止使用基于 Electron 的工具。原生截图应用程序——直接基于操作系统 API 构建,不依赖网页浏览器运行时——没有相同的内存泄漏风险。
Maxisnap 是为 Windows 原生构建的。它不使用 Electron、Chromium 或 Node.js。它直接使用 Windows API 进行屏幕捕获,GDI+ 进行图像处理,并使用轻量级 UI 框架构建标注编辑器。结果是:
- ~35 MB 空闲内存 — 并且它会一直保持在 ~35 MB。不会随时间增长。没有泄漏。
- 安装大小低于 70 MB — 相比之下,Monosnap 超过 200 MB(其中大部分是捆绑的 Chromium)
- 零 Electron 进程 — 任务管理器中只有一个进程,资源使用可预测
- 无需重启 — 可运行数周而内存不增长
其功能集涵盖了大多数 Monosnap 用户所需的一切:区域截图、全屏截图、11 种标注工具(包括用于敏感数据的模糊功能),以及通过 SFTP、FTP、S3 或 HTTP 上传。 查看完整对比.
从 Monosnap 迁移到 Maxisnap
过渡大约需要五分钟:
- 下载 Maxisnap — 小于 70 MB,大约一分钟内安装完成
- 学习热键 —
Ctrl+Alt+5(区域),Ctrl+Alt+6(全屏),Ctrl+Alt+7(自动上传)。 完整快捷键指南在此. - 配置上传 (可选)— 如果您使用 Monosnap 的云服务,请设置 SFTP 上传到您自己的服务器 以实现类似的截图即链接工作流,而无需依赖 Monosnap 的云服务。
- 禁用 Monosnap 启动 — 设置 > 通用 > 取消勾选“开机启动”
- 启用 Maxisnap 启动 — 设置 > 勾选“随 Windows 启动”
即使卸载桌面应用后,您从 Monosnap 云服务获取的截图仍可通过 Monosnap 的网页界面访问。新的截图将通过 Maxisnap 处理。
为什么这个问题无法解决
Electron 内存泄漏出了名的难以修复,因为它们分布在框架的各个层中。渲染器进程中的泄漏与主进程或 Node.js 层中的泄漏需要不同的调试方法。在一个复杂的 Electron 应用程序中查找并修复每一个泄漏本质上是一个持续进行的项目,而非一次性修复。
Monosnap 团队需要投入大量的工程精力进行内存分析和泄漏修复,或者在不使用 Electron 的情况下重写应用程序。鉴于该问题已在多个主要版本中持续存在,这两者似乎都不在他们的路线图上。
对于用户而言,这意味着问题不会消失。您可以通过重启和变通方法来管理它,或者通过切换到不带 Electron 开销的工具来彻底解决它。
总结
截图工具应该是隐形的。它应该静静地待在系统托盘中,占用极少的资源,并在您按下 hotkey 时捕获屏幕。它不应该是您的电脑在演示过程中卡死的原因。
如果 Monosnap 的内存使用影响了您的工作,上述临时修复措施会有所帮助。但永久解决方案显而易见:使用一款专为该任务打造的工具,而不是在后台运行一个网页浏览器的累赘。
下载 Maxisnap 并比较您在前后使用任务管理器的情况。差异立竿见影。 免费供个人使用 — 免费试用。