※本ページにはプロモーション(広告)が含まれています
Process Explorerでハンドルリークを検出する方法と対処法
Windows 11のシステムがだんだん重くなる、メモリが減り続ける、再起動しないと回復しないといった症状に悩んでいませんか?その原因のひとつが「ハンドルリーク」です。ハンドルリークはプロセスがOSリソースを解放し忘れることで発生し、放置すると深刻なパフォーマンス低下につながります。本記事では、無料ツール「Process Explorer」を使ってハンドルリークを検出・特定し、対処する方法を詳しく解説します。

この記事でわかること
- ハンドルリークの仕組みとWindowsへの影響
- Process Explorerのインストールと基本操作
- ハンドルリークを検出するための具体的な手順
- 問題のあるプロセスを特定して対処する方法
- ハンドルリーク検出に役立つ追加ツール
ハンドルリークとは何か
Windowsにおける「ハンドル」の概念
Windowsでは、プロセスがファイル・レジストリキー・スレッド・プロセス・イベントなどのOSリソースを使用する際、「ハンドル(Handle)」と呼ばれる参照識別子を受け取ります。プロセスがそのリソースを使い終わったら、ハンドルを閉じてOSに返却する必要があります。
ハンドルはOSのカーネルオブジェクトへの参照であり、各プロセスはオープンしているハンドルの一覧(ハンドルテーブル)を持っています。正常なプログラムは、リソースを使用し終えた後にCloseHandle()などのAPI関数を呼び出してハンドルを解放します。
ハンドルリークとは
ハンドルリークとは、プログラムがハンドルを開いたまま閉じるコードが実行されず、ハンドルが蓄積し続ける状態です。例えばファイルを開いてもCloseHandle()を呼ばずにエラーで抜けてしまったり、ループ処理のたびに新しいハンドルを開いて閉じないままにしたりするケースが典型例です。
ハンドルが蓄積するとシステムリソースが枯渇し、以下の症状が現れます。
- アプリケーションの応答が遅くなる
- 新しいプロセスやファイルを開けなくなる
- メモリ使用量が時間とともに増加する
- Windowsのイベントログにエラーが記録される
- 最終的にシステムがフリーズまたはブルースクリーン(BSOD)に至ることがある
ハンドルリークとメモリリークの違い
ハンドルリークはメモリリークと混同されやすいですが、異なる問題です。メモリリークはプログラムがメモリを確保したまま解放しない問題であり、ハンドルリークはOSリソース参照を解放しない問題です。両者は同時に発生することも多く、Process Explorerでは両方を監視できます。
ハンドルリークがWindows 11システムに与える影響
パフォーマンス劣化のメカニズム
ハンドルリークがシステムパフォーマンスに与える影響は段階的に現れます。最初の段階では、ハンドルを蓄積しているプロセス自身の動作が重くなります。次の段階では、他のプロセスが新しいリソースを確保しようとしても失敗するようになり、システム全体のレスポンスが低下します。
特にWindowsのカーネルが管理できるハンドル数には上限があります(デフォルトで約1,600万ハンドル)。この上限に近づくと、新しいプロセスの起動や、ファイル・レジストリの操作がエラーになります。これが「Windowsが不安定になって再起動が必要」という状況の原因のひとつです。
ハンドルリークが発生しやすいシナリオ
ハンドルリークが実際の運用で発生しやすい状況は以下のとおりです。
- サーバーや業務PCで24時間365日、同じアプリケーションを起動し続けているケース
- ログファイルを頻繁に開いて書き込むアプリが、エラー発生時にファイルを閉じないケース
- Windowsサービスがリモートからの接続要求のたびに新しいハンドルを生成するが、切断後に解放しないケース
- ゲームやメディアプレーヤーがグラフィックスリソースを大量に確保して解放しないケース
- 自動更新処理がバックグラウンドで大量のファイルを開いたままにするケース
早期発見のためのWindowsイベントログ活用
ハンドルリークの兆候はWindowsのイベントログに記録されることがあります。「イベントビューアー」→「Windowsログ」→「システム」で、ソース「Kernel-PnP」「Win32k」「Application Error」に関連する警告・エラーを確認してください。特に「ハンドル数が高しきい値に達した」旨のログが記録されている場合は、早急にProcess Explorerで原因プロセスを特定してください。
Process Explorerの概要とインストール
Process Explorerとは
Process ExplorerはMicrosoft Sysinternalsが無料で提供しているプロセス監視ツールです。Windowsの標準タスクマネージャーより格段に詳細な情報を表示でき、各プロセスのハンドル数・CPU使用率・メモリ使用量・DLL情報・開いているファイルなどをリアルタイムで確認できます。
インストール方法
Process Explorerはインストール不要の単体実行ファイルです。Microsoftの公式サイト(https://learn.microsoft.com/ja-jp/sysinternals/downloads/process-explorer)からダウンロードして展開し、procexp64.exe(64ビット)またはprocexp.exe(32ビット)を管理者として実行します。
管理者権限で実行しないと、一部のシステムプロセスの情報が取得できないため、必ず「管理者として実行」で起動してください。
Process Explorerを使ったハンドルリーク検出手順

手順1: ハンドル数の表示列を追加する
Process Explorerを起動したら、まずハンドル数の列を表示します。
- 「View」メニューから「Select Columns」を選択
- 「Process Performance」タブをクリック
- 「Handle Count」にチェックを入れてOKをクリック
これにより、プロセス一覧にハンドル数が表示されます。
手順2: ハンドル数を継続的に監視する
ハンドルリークを検出するには、時間の経過とともにハンドル数が増加しているかどうかを確認します。プロセス一覧でHandle Countが異常に多いプロセス(数千以上)、または時間とともに増加しているプロセスに注目してください。
正常なプロセスは、ハンドル数が安定しているか、ゆるやかに増減します。ハンドルリークが起きているプロセスは、ハンドル数が単調増加し続けます。
手順3: 特定プロセスのハンドル詳細を確認する
怪しいプロセスを特定したら、そのプロセスをクリックして選択します。画面下半分に、そのプロセスが開いているハンドルの一覧が表示されます(「View」→「Lower Pane View」→「Handles」が有効になっている必要があります)。
ハンドル一覧で同じファイルやレジストリキーが大量に表示されている場合、それがリークの原因である可能性が高いです。
手順4: Find Handleを使って特定ハンドルを追跡する
「Find」メニューから「Find Handle または DLL」を選択すると、特定のファイル名・オブジェクト名でハンドルを検索できます。疑わしいリソース(例: 特定のログファイルやレジストリキー)を開いているプロセスを特定するのに役立ちます。
手順5: Process Monitorと組み合わせてリークを追跡する
同じSysinternalsのProcess Monitor(ProcMon)と組み合わせると、ハンドルの開閉イベントを時系列で追跡できます。フィルタでCloseFileイベントのないままCreateFileが繰り返されているプロセスを探すことで、リークの発生箇所を特定できます。
Performance Monitorを使った長期ハンドル数モニタリング
データコレクターセットの設定方法
Process Explorerによるリアルタイム監視に加え、Windowsに標準搭載の「パフォーマンスモニター」(perfmon.exe)を使うと、ハンドル数の長期的な推移を記録できます。これにより、特定の時間帯にハンドルが急増するパターンを発見できます。
設定手順は以下のとおりです。
- Windowsキー + R を押し「perfmon.exe」と入力してEnter
- 左側ペインの「データコレクタセット」→「ユーザー定義」を右クリック
- 「新規作成」→「データコレクタセット」を選択
- 「パフォーマンスカウンターデータログを作成する」を選択してカウンターを追加
- 「Process\Handle Count」のカウンターを監視したいプロセス名で追加
- サンプリング間隔を60秒程度に設定してスタート
収集したデータの分析方法
データコレクターセットの記録が溜まったら、パフォーマンスモニターのレポート機能でグラフ表示できます。ハンドル数が業務時間帯に急増して夜間に回復しない場合は、その時間帯に起動するバッチ処理や定期タスクが原因の可能性があります。タスクスケジューラー(taskschd.msc)と照合して原因を絞り込んでください。
ハンドルリークを発見した後の対処法
対処法1: 問題のあるアプリケーションを再起動する
最も即効性のある対処は、ハンドルリークを起こしているプロセスを再起動することです。プロセスを終了することで蓄積したハンドルはすべて解放されます。ただし、プロセスを再起動してもすぐに再びハンドルが増加し始める場合は、根本的な修正が必要です。
対処法2: アプリケーションを最新バージョンにアップデートする
ハンドルリークはソフトウェアのバグであることがほとんどです。ベンダーがすでに修正パッチを提供している可能性があります。アプリケーションを最新バージョンにアップデートすることで、修正されたバージョンに切り替えてください。
対処法3: Windowsのシステムファイルチェッカーを実行する
Windowsシステムのファイル整合性の問題がハンドルリークにつながることがあります。管理者権限のコマンドプロンプトで以下を実行してください。
sfc /scannow に続いて DISM /Online /Cleanup-Image /RestoreHealth を実行することで、システムファイルの破損を修復できます。
対処法4: サービスを再起動する(システムプロセスの場合)
Windows Update、WMI(Windows Management Instrumentation)、Remote Desktop Servicesなどのシステムサービスがハンドルリークを起こすケースもあります。「サービス」(services.msc)から当該サービスを特定して再起動することで、一時的に解消できます。
対処法5: Windowsのイベントログを確認する
「イベントビューアー」(eventvwr.msc)のWindowsログ→システムやアプリケーションを確認してください。ハンドルリークに関連するエラーや警告が記録されている場合があり、問題の特定に役立ちます。
ハンドルリークの予防策と開発者向けベストプラクティス
ユーザーができる予防策
開発者ではないユーザーがハンドルリークを予防するためにできることは限られますが、以下の習慣でリスクを軽減できます。
- 長期間起動したままのアプリは定期的に再起動する(特にブラウザ・メールクライアント・バックアップツール)
- Windowsのシステムが遅くなったと感じたら定期的に再起動してハンドルをリセットする
- 不要なスタートアップアプリを無効化してハンドルリークの原因プロセスを減らす
- Windows Updateを定期的に適用して既知のバグを修正する
Windowsタスクスケジューラーを使った定期的なサービス再起動
特定のサービスやアプリがハンドルリークを繰り返す場合、Windowsのタスクスケジューラーを使って定期的に再起動する回避策があります。「タスクスケジューラー」(taskschd.msc)で新しいタスクを作成し、週1回など適切な間隔でサービスを再起動するよう設定することで、ハンドルが蓄積する前にリセットできます。
開発者向け: ハンドルリークを防ぐコーディングの原則
Windows APIを使ったプログラムでハンドルリークを防ぐには、以下の原則を守ることが重要です。
- すべてのCreateFile / OpenProcess / RegOpenKeyEx等の呼び出しに対応するCloseHandle / RegCloseKey等を確実に実行する
- 例外が発生しても必ずハンドルが閉じられるよう、C++ではRAII(Resource Acquisition Is Initialization)パターンを使用する
- Codeのレビュー時にすべてのハンドル取得箇所に対応する解放コードがあるかを確認する
- Visual StudioのApplication Verifierを使って開発・テスト段階でリークを検出する
- 静的解析ツール(Cppcheck・PVS-Studioなど)でハンドルリークパターンを自動検出する
特定アプリのハンドルリーク問題への問い合わせ方法
使用しているアプリにハンドルリークが疑われる場合、アプリのベンダーへの報告が根本解決への最も確実な方法です。Process Explorerでキャプチャした画面スクリーンショット(ハンドル数の増加傾向が分かるもの)と、どの操作をしたときにハンドルが増えるかの手順を添えてサポートに連絡してください。具体的な再現手順があると、開発者が修正しやすくなります。
ハンドルリーク検出方法の比較表
| ツール | 主な用途 | 難易度 | リアルタイム監視 |
|---|---|---|---|
| Process Explorer | ハンドル数の監視・特定プロセスのハンドル一覧 | 初級〜中級 | 可能 |
| Process Monitor | ハンドルの開閉イベントの時系列追跡 | 中級 | 可能 |
| Performance Monitor | システム全体のハンドル数の長期グラフ | 初級 | 可能 |
| Windows Task Manager | 簡易プロセス確認 | 初級 | 限定的 |
| WinDbg | カーネルレベルのハンドルテーブル解析 | 上級 | 可能 |
| Handle(Sysinternals) | コマンドラインでハンドル検索 | 中級 | スナップショット |
よくある質問(FAQ)

この記事に関連するおすすめ商品
Windows 11向け解説書(パフォーマンスチューニング)
約2,500円〜
Sysinternalsなどのツールを使ったWindowsシステム最適化の解説書
高速DDR5メモリ(RAM増設)
約8,000円〜
ハンドルリーク対策でメモリを増設してシステムに余裕を持たせる
※ 価格は変動します。最新価格はリンク先でご確認ください
Q1. Process ExplorerでHandle Countが1,000以上あるプロセスは異常ですか?
一概には異常とは言えません。Visual StudioやChromiumベースのブラウザなどは正常動作でも数百〜数千のハンドルを持つことがあります。問題は数の大きさよりも、時間とともに単調増加しているかどうかです。数時間にわたって増加し続けている場合はリークの可能性があります。
Q2. Process Explorerをインストールせずに同様の確認ができますか?
タスクマネージャー(Ctrl+Shift+Esc)の「詳細」タブでハンドル数の列を追加することができます。右クリック→「列の選択」→「ハンドル」にチェックを入れてください。ただし、開いているハンドルの詳細(どのファイルやオブジェクトか)はProcess Explorerのほうがはるかに詳しく確認できます。
Q3. ハンドルリークをWindowsのパフォーマンスモニターで監視できますか?
はい、パフォーマンスモニター(perfmon.exe)で「Process\Handle Count」カウンターを追加することで、特定プロセスのハンドル数を時系列グラフで監視できます。長時間の傾向を記録するには、パフォーマンスモニターのデータコレクターセットを利用してください。
Q4. システムプロセス(svchost.exeなど)がハンドルリークを起こしています。どうすればよいですか?
svchost.exeは複数のWindowsサービスをホストするプロセスです。Process Explorerでsvchost.exeをダブルクリックして「Services」タブを確認することで、どのサービスがそのsvchost.exeを使っているかを特定できます。問題のサービスを特定したら、そのサービスを再起動するか、Windows Updateで修正パッチを確認してください。
Q5. 開発しているアプリでハンドルリークが発生しています。どう調査しますか?
Visual StudioのDiagnostic Toolsを使うと、アプリのデバッグ中にハンドル数の推移を確認できます。また、Application Verifierを使うことでハンドルのリーク検出が可能です。Process Explorerで当該プロセスのハンドルを継続監視しながら、特定の操作でハンドルが増えるかを確認してください。増加パターンから問題のある操作を特定できます。
Q6. svchost.exeのハンドル数が数千に達しています。これは正常ですか?
svchost.exeは複数のWindowsサービスをホストしているため、ハンドル数が多いのは一般的です。ただし、継続的に増加している場合は問題があります。Process Explorerでsvchost.exeを右クリックし「Properties」→「Services」タブでどのサービスが含まれるかを確認してください。問題のあるサービスを特定したらそのサービスだけを再起動することで、システム全体に影響を与えずに対処できます。
Q7. ハンドルリークがあるとブルースクリーン(BSOD)になりますか?
ハンドルリーク自体がBSODの直接原因になることは少ないですが、ハンドルリークが進行してシステムリソースが枯渇した状態では、カーネルのメモリ割り当てに失敗してBSODが発生することがあります。特にドライバーレベルのハンドルリーク(カーネルモードドライバーのバグ)は、BSODにつながる危険性が高いです。BSODが繰り返される場合は、エラーコードを確認してWinDbgなどの高度なツールで原因を特定してください。
Q8. リモートデスクトップ(RDP)使用中にハンドルリークが加速する場合があります。なぜですか?
リモートデスクトップ(RDP)を多用する環境では、接続・切断のたびにセッション関連のハンドルが生成されます。RDPの接続が多い場合、TermService(Remote Desktop Services)がハンドルリークを起こすバグが過去に報告されています。Windows Updateで修正パッチが提供されていることが多いため、最新のアップデートを適用してください。また、不要なRDPセッションをこまめに切断することでハンドルの蓄積を防げます。
まとめ
Windows 11でProcess Explorerを使ったハンドルリーク検出は、パフォーマンス問題のトラブルシューティングにおいて非常に有効な手段です。ハンドルリークはプログラムのバグによって発生し、放置するとシステム全体の不安定化につながります。
対処の流れをまとめると以下のとおりです。
- Process Explorerを管理者権限で起動し、Handle Count列を追加
- ハンドル数が増加し続けているプロセスを特定
- プロセスのハンドル詳細を確認して問題のリソースを特定
- 問題プロセスの再起動・アップデートを実施
- 再発する場合はProcess Monitorと組み合わせて詳細分析
Process ExplorerはWindows管理者の必携ツールです。ぜひSysinternalsのツール群を活用して、Windows 11のシステムを健全に維持してください。
minto.tech スマホ(Android/iPhone)・PC(Mac/Windows)の便利情報をお届け! 月間アクセス160万PV!スマートフォン、タブレット、パソコン、地デジに関する素朴な疑問や、困ったこと、ノウハウ、コツなどが満載のお助け記事サイトはこちら!