内存泄漏不是你的电脑问题
如果你一直在想是不是你的机器问题——旧驱动、Windows 11 的怪异行为、失控的 Chrome 标签页——那都不是。内存泄漏问题出在 Monosnap 内部,而且已经存在多年。搜索 r/monosnap 你会发现一个又一个帖子描述着相同的模式。
以下是幕后发生的事情。每次 Monosnap 捕获一个区域时,它都会分配一个足够大的帧缓冲区来保存原始像素数据。对于 2560 x 1440 的屏幕,这大约是 14 MB。当编辑器关闭时,这些缓冲区应该被释放回操作系统。但在 Monosnap 中,它们通常不会被释放——它们被 Electron 渲染器的堆保留,等待一个要么从不运行要么运行太晚的垃圾回收过程。在一个工作日内进行 40 次以上的捕获,这些被保留的缓冲区会累积成数百兆字节的“幻影”RAM。
解决方案是换一个不同的应用程序
Monosnap 的架构将内存泄漏与 Electron 本身绑定,修补它需要重写捕获管道。这种重写在五年内都没有发生。实际的解决方案是使用一个从一开始就没有这个问题的工具。
Maxisnap 基于 PyQt6 构建,并使用 PyInstaller 编译成一个独立的 Win32 可执行文件。没有 Chromium 进程。每次捕获都会分配一个 QImage,编辑器引用它,当窗口关闭时,引用被删除,内存立即返回给操作系统——因为 PyQt 的所有权模型和 Python 的引用计数都倾向于立即释放,而不是等待分代垃圾回收。
根据经验:Maxisnap 启动时空闲内存约为 50 MB。在连续运行 72 小时并进行常规捕获后,它仍然保持在 50 MB 左右。上面的图表来自实际日志。
切换步骤
- 0:00下载 Maxisnap。 前往 下载页面。一次点击,63 MB。
- 0:15退出 Monosnap。 右键点击其托盘图标,选择“退出”。看着你的 RAM 骤降 600 MB。
- 0:30运行安装程序。 默认安装路径,无需重启。
- 0:45按下 Ctrl+Alt+5。 使用你一直使用的相同快捷键进行第一次捕获。编辑器即时打开。
- 0:60完成。 如果你想上传到服务器,请在“设置”中粘贴你的 SFTP/S3 凭据。
内存泄漏问题
我每天只截取 5 张截图。内存泄漏还会影响我吗?
影响较轻,但仍然会。即使你不进行捕获,Monosnap 也会轮询剪贴板和系统托盘,因此空闲内存仍然会增长。在低使用率下增长较慢,但从未停止。
重启应用程序有帮助吗?
暂时有帮助。退出并重新启动后,你会回到大约 180 MB。但大多数注意到内存泄漏的用户之所以遇到这个问题,是因为他们让截图工具全天运行,而多次重启与他们的期望背道而驰。
macOS 上的 Monosnap 呢?
macOS 上的内存泄漏不那么严重,因为内存模型不同,但用户仍然报告内存逐渐增长。Maxisnap 的 macOS 版本是实验性的。对于 Windows 用户,请立即切换。