為什麼 Monosnap 會讓您的電腦凍結以及如何解決
您正在工作期間 — IDE 開著,瀏覽器開了二十個分頁,Slack 正在運行,可能還有 Docker 在背景。您的電腦開始變慢。滑鼠卡頓。應用程式需要五秒鐘才能回應。您打開工作管理員,發現 Monosnap 正在使用 800 MB、1.2 GB,有時甚至超過 2 GB 的 RAM。
這不是您報告並期望修復的錯誤。這是一個根植於 Monosnap 架構的系統性問題。用戶多年來一直報告此問題,但由於其根本原因與 Monosnap 的構建方式息息相關,因此尚未解決。
本文解釋了它發生的原因、如何診斷、臨時解決方案,以及 — 當您受夠了 — 永久解決方案。
根本原因:Electron 和記憶體洩漏
Monosnap 是基於 Electron 構建的,這是一個透過捆綁 Chromium(Chrome 背後的引擎)和 Node.js 將網路應用程式作為桌面應用程式運行的框架。每個 Electron 應用程式本質上都在背景運行一個網路瀏覽器,這就是為什麼 Electron 應用程式往往比原生應用程式消耗更多資源的原因。
Electron 本身並不會固有地導致記憶體洩漏 — 精心構建的 Electron 應用程式能有效管理記憶體。但 Electron 使記憶體洩漏更容易引入且更難檢測。JavaScript 的垃圾回收、Chromium 的渲染管線和 Node.js 的事件循環的結合,創造了多個可能發生記憶體洩漏的表面。
在 Monosnap 的案例中,根據用戶報告和系統分析,出現了幾種已報告的洩漏模式:
影像緩衝區累積
Monosnap 捕獲的每個螢幕截圖都作為影像緩衝區存在於記憶體中。在一個良好實作的工具中,這些緩衝區在影像儲存或上傳後會被釋放。在 Monosnap 中,用戶報告表明,來自先前捕獲的影像緩衝區並未完全釋放,導致記憶體隨著每次截圖而增長。在一個會話中截取 50 張螢幕截圖,您將有 50 個部分保留的影像緩衝區消耗 RAM。
渲染器程序膨脹
Electron 應用程式使用渲染器程序(本質上是 Chrome 瀏覽器分頁)來呈現其使用者介面。Monosnap 的編輯器、預覽和設定視窗都各自作為渲染器程序運行。如果這些程序在視窗關閉時未正確清理,它們的記憶體分配將會持續存在。在長時間使用並多次開啟和關閉編輯器的情況下,這會導致記憶體累積。
事件監聽器洩漏
已註冊但從未取消註冊的 JavaScript 事件監聽器是 Electron 應用程式中記憶體洩漏的經典來源。每個監聽器都持有一個引用,阻止垃圾回收器釋放相關記憶體。在一個持續監聽全域快捷鍵、剪貼簿變更和顯示事件的工具中,即使是微小的監聽器洩漏也會隨著時間累積。
如何診斷問題
如果您懷疑 Monosnap 導致您的系統變慢,以下是確認方法:
工作管理員檢查
- 按下
Ctrl+Shift+Esc以開啟工作管理員 - 如果您看到簡化視圖,請點擊「更多詳細資料」
- 點擊「記憶體」欄位標題以按 RAM 使用量排序
- 尋找「Monosnap」條目 — 可能有多個(每個 Electron 程序一個)
- 記下所有 Monosnap 程序佔用的總記憶體
螢幕截圖工具的正常閒置記憶體為 30-60 MB。如果 Monosnap 的總記憶體超過 300 MB,則表示存在洩漏。超過 500 MB 則情況嚴重。超過 1 GB 則會積極降低您的系統效能。
資源監視器深入探討
如需更多詳細資訊,請開啟資源監視器(resmon 從執行對話框):
- 前往「記憶體」分頁
- 尋找 Monosnap 程序
- 檢查「工作集」(實際使用的實體 RAM)和「私有」(Monosnap 專用的記憶體)
- 在正常使用 30 分鐘內觀察這些值 — 如果它們在您沒有截圖的情況下呈上升趨勢,則確認存在洩漏
暫時性解決方案
這些權宜之計只能管理症狀,無法修復根本的洩漏問題。
定期重新啟動 Monosnap
最簡單的權宜之計。右鍵點擊 Monosnap 的系統匣圖示,退出,然後重新啟動。這會清除所有累積的記憶體。有些使用者會設定 Windows 工作排程器任務,每隔幾小時重新啟動 Monosnap。
停用雲端同步
Monosnap 的雲端同步功能會在記憶體中保留額外的連線和資料。如果您不使用雲端儲存,請在「設定」中停用它。這不會完全消除洩漏,但可能會降低記憶體增長的速度。
減少背景活動
停用您不使用的功能:剪貼簿監控、自動截圖、整合外掛程式。每個啟用的功能都會增加事件監聽器和可能洩漏的背景程序。
使用 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 閒置記憶體 (RAM) — 並維持在 ~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 開銷的工具來徹底解決它。
最終想法
螢幕截圖工具應該是隱形的。它應該靜靜地待在您的系統匣中,消耗微不足道的資源,並在您按下快捷鍵時捕捉您的螢幕。它不應該是您的電腦在演示期間凍結的原因。
如果 Monosnap 的記憶體使用量正在影響您的工作,上述的臨時修復方法將會有所幫助。但永久的解決方案顯而易見:使用專為此任務打造的工具,而無需在背景運行網頁瀏覽器的負擔。
下載 Maxisnap 並比較您前後的任務管理器。差異立竿見影。 個人使用免費 — 試用無需任何費用。