問題タブ [vmmap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
956 参照

c# - vmmap からのプライベート データのアドレスを使用して、そこに何が入っているかを調べるにはどうすればよいですか?

ここに画像の説明を入力

仮想サイズが大きすぎる (26 GB) Windows プロセスがあります。VMMap を使用して、メモリのレイアウト方法をマップし、プライベート データのアドレスを取得しました。これは予約として表示されます。 .

そこにあるものを表示するにはどうすればよいですか? それは可能ですか

0 投票する
2 に答える
1531 参照

windows - vmmap に表示される情報をプログラムで取得するにはどうすればよいですか?

Mark Russovich の講演 "Mysteries of Memory Management Revealed" を見たことがある人なら誰でも知っているように、vmmap ツールは、他のほとんどのツールが認識していないように見えるプロセス制限 (vanilla 32 ビット ウィンドウでは 2GB) に対してカウントされるものを表示できます。

実際の合計メモリ サイズ (プロセスの制限に密接に関連するもの)をプログラムで監視できるようにして、少なくともプロセスの制限に近づいたときに何が起こっているかをログに記録できるようにしたいと考えています。vmmap がこれを行う方法について公開されている情報はありますか?

... また、なぜこの情報は入手が難しいのでしょうか??

それについて私が知っていること(AFAIK)では、全体像がわかりません。

  • ::GetProcessMemoryInfo は、プライベート メモリの使用状況に関する情報のみを返すようです
  • System.Diagnostics.Process.VirtualMemorySize64 は、まだ vmmap によって示される合計と完全には一致しないかなり大きな数を返します。
0 投票する
2 に答える
3066 参照

windbg - windbg> !EEHeap -gc で VMMAP.exe よりもはるかに小さいマネージ ヒープが表示されるのはなぜですか?

時間の経過とともにメモリ使用量が増加する C# アプリケーションがあります。定期的にユーザー モード ダンプを取得し、sos を読み込んだ後、!EEHeap -gc を実行してマネージド ヒープ サイズを監視しました。windbg/sos では、14MB まで開始して 160MB まで成長し、その後 15MB まで縮小するのを見てきましたが、アプリケーションの「プライベート バイト」が大幅に減少することはありません。「プライベート バイト」の増加の原因となっているアクティビティを特定したので、メモリの増加がいつ発生するかを制御できます。

Vmmap.exe を実行してみましたが、約 360 MB のマネージド ヒープがレポートされ、クイック ダンプが取得され、windbg/sos/eeheap -gc を使用すると 15 MB しか表示されないことがわかりました。

なぜこのように異なる値が表示されるのでしょうか? マネージ ヒープは本当に vmmap.exe が報告するものですか?

windbg でマネージド ヒープのこの領域を調べるにはどうすればよいですか?

0 投票する
1 に答える
605 参照

windows - Windows タスク マネージャーと VMMap で異なるメモリ使用量が表示されるのはなぜですか?

Delphi7 で記述され、Windows Server 2003 R2 Standard Edition SP2 で実行されているサーバー アプリケーションを分析しています。メモリ不足になったときに確認する必要があります。タスク マネージャーに表示されるメモリ使用量と SysInternals VMMap に表示されるメモリ使用量は異なります。なんで?提案、リンクはありますか?タスク マネージャー: 「メモリ使用量」はヘルプによるワーキング セットであり、「VM サイズ」はコミット済みメモリです。

タスク マネージャーでは 801 MB のメモリをコミットしましたが、VMMap では 877 - 76 MB の違いは何ですか?

メモリの使用法: Win タスク マネージャーと VMMap の比較

0 投票する
1 に答える
471 参照

c++ - メモリリークを見つけるにはどうすればよいですか?

MFC でアプリケーションを作成しました。アプリケーションを 18 時間実行した後、プロセスは 2.5 GB のメモリ使用量に達しました。メモリリークを見つけるために VMMap を試しました。しかし、それは高レベルのデータしか提供しません。

ダンプ ファイルからメモリ リークを取得できるツールはありますか、または VMMap を使用してメモリ リークの原因を特定するツールはありますか。

0 投票する
2 に答える
4924 参照

c# - VMMAP で「プライベート データ」とは何を定義していますか?

VMMap を使用して、混合モード (マネージドおよびアンマネージド) アプリケーションでの仮想/プロセス アドレス空間の使用率を分析しています。Windows VMM と仮想メモリ API のしくみ、ヒープ メモリ API のしくみも理解しています。私が使用している CRT の実装を (詳細ではありませんが) 見て、(これは私の失敗かもしれませんが) 前述の Win32 API がどのように使用されるかを理解しています。

この「プライベートデータ」統計が私に何を示しているのかを理解しようとしています。私のアプリケーションは、Win32 メモリ API 関数を直接呼び出すことはなく、ネイティブ C++ では「malloc/new」、C# では「new」のみを使用します (これは、Win32 メモリ管理 API を使用します)。

VMMap による「プライベート データ」の定義は次のとおりです。

プライベート メモリは、VirtualAlloc によって割り当てられるメモリであり、ヒープ マネージャまたは .NET ランタイムによってサブ割り当てされることはありません。他のプロセスと共有することはできず、システムのコミット制限に対して課金され、通常はアプリケーション データが含まれます。

この定義から、VirtualAlloc を呼び出しているのは誰でしょうか? それはヒープ マネージャーですか、それとも .Net ランタイムですか?

コミットされたプライベート データのいくつかのアドレスを取得し、WinDbg を使用して調べることができました....まあ... Microsoft は彼らの知恵で ntdll パブリック シンボルを無効にしたことが判明したため、WinDbg はうまく機能しません - 私は要求があれば、これに関する詳細を提供できますが、基本的に !address -summary などのコマンドは、シンボルが見つからないために機能しなくなります。

この質問を別の言い方をすると、次のようになります。このプライベート データ統計を増加または減少させる C++ または C# コードを記述できますか? それとも、これはすべて OS、C++ ランタイム、または .Net ランタイムによって管理されているので、気まぐれに翻弄されているのでしょうか?

VMMap の性質 (他のメモリ タイプは排他的) から、この「プライベート データ」は次のタイプのアドレス空間のいずれにもなりえないと推測できます。

  • ヒープ (これには、上記のプライベート データの説明で説明したように、VirtualAlloc の呼び出しによって予約された、コミットされたヒープ領域と予約されたヒープ領域が含まれることに注意してください)。
  • マネージド ヒープ
  • スタック
  • 共有可能
  • マップされたファイル
  • 画像
  • ページテーブル
  • 使用不可
  • 無料

(VMMap が上記のすべてのタイプと見なすものを定義するオンライン ヘルプ ファイルは見つかりませんでしたが、ヘルプ ファイルをダウンロードするためのリンクは次のとおりです: https://technet.microsoft.com/en-us/library/dd535533.aspx )

私のアプリケーションでは、ヒープ/マネージド ヒープ/スタックのサイズが予想どおりに変化しているにもかかわらず、プライベート データの合計 (予約済みおよびコミット済み) サイズが、アプリケーションの有効期間を通じてほぼ一定のままであることに気付きました。また、プライベート データで使用される合計 250Mb のうち、実際にコミットされているのは 33Mb のみであることにも気付きました。これを測定する私の方法はかなり初歩的であるため、測定ごとに値が変化している可能性があり、それが表示されていないことに注意してください(これが何を測定しているかを知っていれば、DebugDiagを使用してプロセスのダンプを取得できます関連するカウンターが特定のしきい値に達した場合 (ニワトリとエッグ)。

私の現在の投機的理論は、これは、ネイティブ (または管理されていると思いますか?) ヒープが容量に達したときに成長するために予約されているスペースであるというものですが、これを証明するものは何もありません。そのため、投機的な山にしっかりと残っています。

これに関する詳細をインターネットで検索するのは骨が折れる場合があります。多くの投稿/記事/ブログがあり、物事を混乱させ、自己参照定義を使用しています (パフォーマンス モニターのワーキング セットの定義の最初の文は、この良い例です)。不完全であるか、単に間違っています。多くの場所で、定義があいまいになったり、一貫性のない用語が使用されたりします (フィールドのプライベート データの VMMaps 定義は、それをプライベート メモリと呼んでいることに注意してください。おそらく、多少の不満がありますが、あいまいです)。

インターネットの残りの部分が混乱して不正確になっていることを批判したので...上記に意味をなさないものがある場合、または反対のドキュメントを表示できる場合、またはより明確な定義が必要な場合、私に知らせてください、私も犯罪者リストに入れます!オンラインで誰かに記憶の問題を説明しようとすることの前半は、全員が同じことについて話していることを確認することだと思います.

最後に、この質問: VMMap は特定のメモリ領域がスレッド スタックであることを具体的にどのように認識しますか? 答えが見つからない可能性があることを示唆しています:/

更新/編集: gflags ユーザー スタック トレース (gflags -i myapp.exe +ust) をオンにすると、プライベート データのサイズを増やすことができることがわかりました。これはバックトレース データベースであると想定しますが、gflags がなくても存在します、私が説明するのに苦労しているプラ​​イベートデータがまだあります。

0 投票する
1 に答える
1308 参照

macos - コマンド vmmap 用の API はありますか

コマンド ラインvmmap -v -purge 50554で、プロセス 50554 のメモリ情報を検索し、以下のような出力を取得できます。

しかし、同じ関数を実装するために呼び出すことができる API はありますか?

0 投票する
0 に答える
36 参照

c - プログラムに読み取り、書き込み、または実行が不可能な仮想アドレス範囲があるのはなぜですか?

を参照して bash プログラムが使用する仮想メモリ アドレス範囲を調べると/proc/bash_pid/maps、一部の仮想アドレス範囲が読み取り可能、書き込み可能、​​または実行可能でないことがわかりました。例えば、

私の質問は:

そのような仮想アドレスが読み取り可能、書き込み可能、​​または実行可能でない場合、なぜプログラムはそれを必要とするのですか?

そのアドレス領域が共有ライブラリにリンクされていることは示されていますが、これらのアドレス領域はプログラムにとってまったく役に立たないように思えます。

以下は /proc/pid/maps の完全な出力です