web-dev-qa-db-ja.com

どのプロセスがメモリをコミットしたかを識別する方法

私のシステムはコミットされたメモリで高く動作します(8GB RAM + 2 GBページファイル85%のメモリがコミットされています)。物理使用量は約65%です。

コミットされたメモリの大部分を割り当てているプロセスを特定するにはどうすればよいですか?プロセス間でメモリを共有できることを理解しています。これまで、コミットされたメモリを表示するためにVMMapを使用しましたが、これはプロセスごとに行われ、 ページファイルでバックアップされたセクションは考慮されません

enter image description here

enter image description here

2
Dunken

PowerShellソリューション

1。仮想メモリの最大量を使用して上位10プロセスを取得します

_Get-Process | Sort PagedMemorySize-Desc | Select Name, PagedMemorySize, VirtualMemorySize -First 10
_

出力例

_Name                  VirtualMemorySize PagedMemorySize
----                  ----------------- ---------------
UrBackupClientBackend         685735936       548347904
Explorer                     1529909248       478908416
Microsoft.Photos             1303465984       433094656
MBAMService                   661987328       228876288
MicrosoftEdgeCP               894496768       219799552
MsMpEng                       667783168       205774848
MicrosoftEdgeCP               874590208       202584064
mstsc                         440627200       185860096
javaw                         886177792       185556992
MicrosoftEdgeCP               802746368       146792448
_

2。コミットされたすべての仮想メモリの合計を取得

_Get-WmiObject win32_operatingsystem | Select @{L='commit';E={($_.totalvirtualmemorysize - $_.freevirtualmemory)*1KB/1GB}} 
_

出力例

_commit
------
4.56205749511719
_

サポートリソース

6
Pimp Juice IT

Process Explorer はプロセスごとにこの情報を表示できます:

image

ProcessExplorerで上記の画面を表示する方法は次のとおりです。

  • メニューをクリックします表示>下部ペインを表示
  • メニューをクリックします表示>下部ペインビュー> DLL
  • メニューをクリックします[表示]> [名前のないハンドルとマッピングを表示]
  • 上部ペインでプロセスをクリックします
  • 下のペインのヘッダーを右クリックして、列の選択...を選択します。
  • DLLタブで、マップされたサイズMappinq Type
  • [OK]をクリックします

Process Hacker も同様にこの情報を表示できます。プロセスを選択してダブルクリックした後、[ハンドル]タブでチェックを外します名前のないハンドルを非表示にします

2
harrymc

Process Explorerのプロセスリストの[Private Bytes]列には、コミット料金に対する各プロセスの貢献度が表示されます。下部のペインビューを見る必要はありません。

必ず管理者としてProcessExplorerを実行してください。

タスクマネージャは、[コミットサイズ]列の[詳細]タブに同じ情報を表示します。

タスクマネージャーが「メモリ(プライベートワーキングセット)」列に表示する内容は、「プライベート」という単語を使用している場合でも同じではないことに注意してください。これは、現時点でそのプロセスのRAMにある各プロセスのコミット料金のサブセットを示しています。

Windows Internalsごとに、合計コミット料金への貢献者は次のとおりです。

  • プライベートコミットv.a.s.各プロセスで
  • ページファイルに裏打ちされたマップされたv.a.s. (プロセスの「プライベートバイト」には表示されません)
  • マップされたv.a.sのコピーオンライト領域.
  • 非ページプールとページプール
  • ファイルによって明示的にサポートされていないその他のカーネルスペース割り当て(たとえば、ドライバーまたはntoskrnl.exeのページング可能なコードは、それぞれの実行可能ファイルによってサポートされているため、カウントされません)
  • カーネルスタック-すべてのスレッドに1つあります
  • ページテーブル
  • まだ実際には割り当てられていないが、コミットされたv.a.sのページテーブル用のスペース。もう存在している
  • 「アドレスウィンドウ化拡張」(AWE)の割り当て

Windows Internalsこれらのそれぞれが何であるか、およびそれぞれがシステム全体のコミット料金にカウントされる理由について詳しく説明します。残念ながら、これらの多くのvirtualサイズのカウンターはありません。これは、コミットチャージに関するものです。 RAMmapはそれらのいくつかの物理サイズを示しますが、仮想サイズは示しません。

1
Jamie Hanrahan