4

かなり大規模 (~2.2 MLOC) で、かなり古い (10 年以上前に開始された) C/C++ の Windows デスクトップ アプリケーションがあるとします。モジュールの約 10% は外部にあり、ソースはなく、デバッグ シンボルのみです。

アプリケーションのメモリ使用量を半分に減らすにはどうすればよいでしょうか? 少なくとも、メモリが消費されている場所を見つけるにはどうしますか?

4

7 に答える 7

7

malloc()/ free()およびnew()/ delete()をラッパーでオーバーライドします。ラッパーは、割り当ての大きさ、および(コールスタックを記録し、後でシンボルテーブルに対して解決することにより)それらがどこから作成されたかを追跡します。シャットダウン時に、ラッパーにまだ割り当てられているメモリを表示させます。

これにより、最大の割り当てがどこにあるかを把握し、リークをキャッチすることができます。

于 2008-09-23T18:54:58.837 に答える
3

これは、ゲームのメモリ消費量を 20% 削減するために使用したメモリ トレース アプリケーションの説明/スケルトンです。外部モジュールによって行われた多くの割り当てを追跡するのに役立ちました。

于 2008-09-23T18:59:05.487 に答える
2

それは簡単な作業ではありません。見つけることができるメモリリークを追跡することから始めます(優れたツールはRational Purifyです)。ソースコードをすくい取り、データ構造やアルゴリズムを最適化してみてください。
これが悲観的に聞こえるかもしれませんが、メモリ使用量を50%削減することは現実的ではありません。

于 2008-09-23T18:51:37.847 に答える
1

いくつかの重大な非効率性を非常に早く見つけることができる可能性があります。まず、メモリが何に使用されているかを確認する必要があります。私がこれに非常に便利だと思ったツールはMemoryValidatorです

この「メモリ使用量マップ」を入手したら、ハンギングフルーツが少ないかどうかを確認できます。よりコンパクトな形式で表現できる、大量のメモリを消費するデータ構造はありますか?これは、特に可能であることがよくあります。データアクセスが適切にカプセル化されていて、予備のCPUパワーがある場合は、アクセスごとにデータの圧縮/解凍に専念できます。

于 2008-09-23T19:02:22.733 に答える
0

メモリ使用量分析用のツールの1つは、 Microsoftから無料でダウンロードできるLeakDiagです。どうやら、すべてのユーザーモードアロケータをVirtualAllocに接続し、プロセス割り当てスナップショットをいつでもXMLにダンプすることができます。次に、これらのスナップショットを使用して、どのコールスタックがほとんどのメモリを割り当て、どのコールスタックがリークしているかを判断できます。スナップショット分析用のかなりのフロントエンドがありませんが(MicrosoftPremierSupportを介してLDParser/LDGrapherを取得できない場合)、すべてのデータがそこにあります。

もう1つ注意すべき点は、キャッシングが原因でBSTRアロケータからの誤リークが発生する可能性があることです。「ねえ、なぜすべてのBSTRをリークするのですか?」を参照してください。

于 2008-09-24T11:59:36.813 に答える
0

あなたの質問は適切に提起されているとは思いません。

ソース コードのサイズは、メモリ フットプリントとは直接関係ありません。確かに、コンパイルされたコードはいくらかのメモリを占有しますが、アプリケーションには独自のメモリ要件がある場合があります。静的 (コードで宣言された変数) と動的 (アプリケーションが作成するオブジェクト) の両方。

プログラムの実行をプロファイリングし、コードを注意深く調べることをお勧めします。

于 2008-09-23T18:38:36.550 に答える
0

私が最初に始める場所は次のとおりです。

アプリケーションは、後で使用するために大量のメモリを事前に割り当てますか? この記憶はしばしば未使用のまま放置され、配られることはありませんか? 必要に応じて、新規作成/削除 (または smart_ptr を使用すること) に切り替えることを検討してください。

コードは次のような静的配列を使用していますか?

Object arrayOfObjs[MAX_THAT_WILL_EVER_BE_USED];

この配列でオブジェクトを配りますか?その場合は、このメモリを手動で管理することを検討してください。

于 2008-09-23T19:00:51.350 に答える