大規模で馴染みのないコードベースのメモリフットプリントの削減


4

C/C++でかなり古い(10年以上前に起動した)Windowsデスクトップアプリケーションをかなり古い(〜2.2 MLOC)と仮定します。モジュールの約10%は外部にあり、ソースはありません。デバッグシンボルだけです。

アプリケーションのメモリフットプリントを半減させるにはどうしたらいいですか?少なくとも、どこでメモリが消費されているかを調べるにはどうすればよいでしょうか?

0

私はあなたの質問はよくポーズされているとは思わない。

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

プログラムの実行をプロファイルし、コードを慎重に検討することをお勧めします。

  0

サイズを参照して、原因をキャッシュにBSTRアロケータから偽のリーク陽性を持っているかもしれないということです。 400 KLOCを "慎重に研究する"にはどれくらいの時間がかかると思いますか? :) 23 9月. 082008-09-23 19:01:56

  0

それは簡単にする必要があります。 400kは私が大規模と呼ぶものではありません:)ヒープ割り当てをチェックするだけで、すべてのmallocと新しい呼び出しを見つけるだけで、あなたはほとんどそこにいます。 23 9月. 082008-09-23 19:06:57

  0

gbjbaanb、私はあなたに*ちょっと*モジュールの依存関係のグラフを見せてもらえればいいと思うが、 "すべてのmallocとnewを見つける"ということに関しては、少なくともSysAllocString(CComBSTRsの中に埋もれていることも多い)もある。 23 9月. 082008-09-23 19:45:05


2

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


7

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

これにより、最大の割り当てが行われている場所を見つけ出し、漏れをキャッチすることができます。

  0

割り付け関数アプリケーション全体、好ましくはソースコードの変更が限られているか?また、多くのCOM/BSTR処理があります。彼らのアロケータは分析から除外できないと私は信じています。 23 9月. 082008-09-23 19:39:20


3

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

  0

前にデバッグインタフェースのアクセスを聞いたことがありません。 23 9月. 082008-09-23 20:33:56


0

まず場所は次のようになります。

アプリケーションは、後で使用するために事前割り当てメモリの多くを行うのか?この記憶はしばしば未使用のままで座っているのですか?必要に応じてnewing/delete(またはsmart_ptrの使用を改善する)に切り替えることを検討してください。

コードは

Object arrayOfObjs[MAX_THAT_WILL_EVER_BE_USED]; 

ような静的配列を使用して、この配列にOBJSを配るていますか?その場合は、このメモリを手動で管理することを検討してください。


1

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

です。この「メモリ使用量マップ」を取得したら、「Low Hanging Fruit」を確認することができます。よりコンパクトな形式で表現できる多くのメモリを消費するデータ構造はありますか?これはしばしば可能です。データアクセスがうまくカプセル化され、余分なCPUパワーがあるときは、アクセスごとに圧縮/解凍することができます。

  0

それは、「10年前に作成された、それ以来変化していない」、または「過去10年間、有機的に成長し蓄積している」という意味かどうかによって異なります。 2番目のカテゴリのアプリは間違いなくメモリ豚です。 23 9月. 082008-09-23 19:08:28

  0

それは成長しています。そして蓄積する。リソース消費を削減するという要件は、いつものように上から引き継がれています。 23 9月. 082008-09-23 19:31:54


0

メモリ使用量分析のツールの1つはLeakDiagです(free download from Microsoftで利用可能)。これは明らかに、すべてのユーザーモードアロケータをVirtualAllocにフックし、いつでもプロセス割り当てスナップショットをXMLにダンプすることを可能にします。これらのスナップショットを使用して、どのコールスタックがほとんどのメモリを割り当てるか、どのコールスタックがリークしているかを判断できます。スナップショット分析のフロントエンドが欠けています(ただし、Microsoft Premier SupportからLDParser/LDGrapherを入手できる場合を除く)が、すべてのデータがそこにあります。注意すべき

もう一つは、プロジェクトの全体的な複雑でソースコードヒントの"Hey, why am I leaking all my BSTR's?"