3

私のDelphiXEアプリケーションは、RemObjectsによって作成されたローカルサーバーDLLを使用する単一のEXEに基づいており、十分なメモリがないという例外を生成するまで、特定の操作に大量のメモリを使用します。だから私はこれが起こっている理由と場所を理解しようとしているので、メモリ使用量を報告するコード全体にさまざまなステップを配置しました。問題は、メモリ使用量情報を取得するために使用される方法に基づいて、非常に異なる情報を取得していることです。

  1. FastMMにクライアントEXEとサーバーDLLの両方を直接要求するここで説明する方法を使用すると、次のようになります。

    • ステップ1:[クライアント]=36664572-[サーバー]=3274976
    • ステップ2:[クライアント]=62641230-[サーバー]=44430224
    • ステップ3:[クライアント]=66665630-[サーバー]=44430224
  2. ここで説明したGetProcessMemoryInfoを使用するメソッドを使用すると、はるかに多くのメモリ使用量が得られます。

    • ステップ1:[プロセス] = 133722112
    • ステップ2:[プロセス] = 1072115712
    • ステップ3:[プロセス] = 1075818496

私のメモリの問題に基づいて、2番目の方法が正しいように見えますが、FastMMの方法をどのように「低く」することができますか?そして、何が違いを説明できますか?

4

1 に答える 1

5

GetProcessMemoryInfo は、FastMM によって管理されていないメモリも報告します。たとえば、呼び出す可能性のあるさまざまな Delphi 以外の dll (winapi など) によって割り当てられたメモリなどです。

また、FastMM は、アプリケーションが実際に内部構造、断片化、およびプーリングに使用する Windows からより多くのメモリを割り当てることができます。

最後に、GetProcessMemoryInfo を使用してワーキングセットのサイズを測定します。これは、アプリケーションのメモリの現在、ページ ファイルの代わりに RAM にある部分です。これには単なるデータ構造以上のものが含まれており、アプリケーションが割り当てたメモリの合計とは明らかに比較できません。PagefileUsage の方が比較しやすいでしょう。ワーキングセットのサイズがあなたが探しているものになることはほとんどありません。より良い説明については、こちらを参照してください。

つまり、どちらも異なるものを測定するため、両方とも異なる結果をもたらします。

于 2012-03-14T15:52:49.777 に答える