MonosnapがPCをフリーズさせる理由と解決策
作業セッションの真っ最中 — IDEが開き、ブラウザには20個のタブ、Slackが実行され、もしかしたらDockerがバックグラウンドで動いているかもしれません。コンピューターが遅くなり始めます。マウスが途切れます。アプリケーションの応答に5秒かかります。タスクマネージャーを開くと、そこにMonosnapが800 MB、1.2 GB、時には2 GB以上のRAMを使用しているのが見えます。
これは、あなたが報告して修正を期待するようなバグではありません。これはMonosnapのアーキテクチャに根ざしたシステム的な問題です。何年もの間ユーザーから報告されていますが、Monosnapの構築方法に根本的な原因があるため、解決されていません。
この記事では、なぜそれが起こるのか、診断方法、一時的な回避策、そして — もう十分だと感じたときの — 恒久的な解決策を説明します。
根本原因:Electronとメモリリーク
MonosnapはElectron上に構築されています。Electronは、Chromium(Chromeのエンジン)とNode.jsをバンドルすることで、ウェブアプリケーションをデスクトップアプリとして実行するフレームワークです。すべてのElectronアプリは本質的にバックグラウンドでウェブブラウザを実行しており、これがElectronアプリがネイティブアプリケーションよりも多くのリソースを消費する傾向がある理由です。
Electron自体が本質的にメモリリークを引き起こすわけではありません — 適切に構築されたElectronアプリはメモリを効果的に管理します。しかし、Electronはメモリリークを導入しやすく、検出を困難にします。JavaScriptのガベージコレクション、Chromiumのレンダリングパイプライン、Node.jsのイベントループの組み合わせにより、メモリがリークする可能性のある複数の表面が生まれます。
Monosnapの場合、ユーザーレポートとシステム分析からいくつかの報告されたリークパターンが明らかになっています。
画像バッファの蓄積
Monosnapがキャプチャするすべてのスクリーンショットは、メモリ内に画像バッファとして存在します。適切に実装されたツールでは、これらのバッファは画像が保存またはアップロードされた後に解放されます。Monosnapでは、ユーザーレポートによると、以前のキャプチャからの画像バッファが完全に解放されず、スクリーンショットを撮るたびにメモリが増加する原因となっています。1回のセッションで50枚のスクリーンショットを撮ると、50個の部分的に保持された画像バッファがRAMを消費することになります。
レンダラープロセスの肥大化
Electronアプリは、UIにレンダラープロセス(実質的にはChromeタブ)を使用します。Monosnapのエディター、プレビュー、設定ウィンドウはそれぞれレンダラープロセスとして実行されます。これらのプロセスがウィンドウを閉じるときに適切にクリーンアップされないと、メモリ割り当てが残存します。エディターを何度も開閉する長時間のセッションでは、これが蓄積されます。
イベントリスナーリーク
登録されたものの登録解除されないJavaScriptイベントリスナーは、Electronアプリにおけるメモリリークの典型的な原因です。各リスナーは、ガベージコレクターが関連するメモリを解放するのを妨げる参照を保持します。グローバルホットキー、クリップボードの変更、ディスプレイイベントを継続的にリッスンするツールでは、小さなリスナーリークでも時間の経過とともに蓄積されます。
問題の診断方法
Monosnapがシステム速度低下の原因であると思われる場合、以下の方法で確認できます。
タスクマネージャーでの確認
- Ctrl+Shift+Escを押す
Ctrl+Shift+Escでタスクマネージャーを開く - 簡易表示の場合は「詳細」をクリックします
- 「メモリ」列ヘッダーをクリックしてRAM使用量でソートします
- 「Monosnap」のエントリを探します — 複数ある場合があります(Electronプロセスごとに1つ)
- すべてのMonosnapプロセスにおける合計メモリを記録します
スクリーンショットツールの通常のアイドル時のメモリは30-60 MBです。Monosnapの合計が300 MBを超える場合、リークが発生しています。500 MBを超えると深刻です。1 GBを超えると、システムを積極的に劣化させています。
リソースモニターの詳細分析
詳細については、リソースモニターを開きます(resmon を「ファイル名を指定して実行」ダイアログから):
- メモリタブに移動します
- Monosnapプロセスを見つけます
- 「ワーキングセット」(実際に使用されている物理RAM)と「プライベート」(Monosnap専用のメモリ)を確認します
- 通常使用で30分間これらの値を監視します — スクリーンショットを撮っていないのに値が上昇傾向にある場合、リークが確認されます
一時的な対処法
これらの回避策は症状を管理するものであり、根本的なリークを修正するものではありません。
Monosnapを定期的に再起動する
最も簡単な回避策です。Monosnapのシステムトレイアイコンを右クリックし、終了して再起動します。これにより、蓄積されたすべてのメモリがクリアされます。一部のユーザーは、数時間ごとにMonosnapを再起動するようにWindowsタスクスケジューラジョブを設定しています。
クラウド同期を無効にする
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"
} タスクスケジューラで1時間ごとに実行するように設定してください。一時的な対処療法ですが、効果的です。
恒久的な解決策:ネイティブツールへの切り替え
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プロセスゼロ — タスクマネージャーでのプロセスは1つ、予測可能なリソース使用量
- 再起動不要 — メモリ増加なしで数週間動作
機能セットは、ほとんどのMonosnapユーザーが必要とするすべてをカバーしています:領域キャプチャ、フルスクリーンキャプチャ、11種類の注釈ツール(機密データ用のぼかしを含む)、およびSFTP、FTP、S3、またはHTTP経由でのアップロード。 全比較を見る.
MonosnapからMaxisnapへの移行
移行には約5分かかります:
- Maxisnapをダウンロード — 70 MB未満、約1分でインストール完了
- ホットキーを覚える —
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をダウンロード そして、Task Managerで前後を比較してみてください。その違いはすぐにわかります。 個人利用は無料 — 試すのに費用はかかりません。