2009-05-09 12 views
3

私が作業しているネイティブC++アプリケーションは、自分のコードに入る前からかなり大きなメモリフットプリント(20MB)があることに気付きました。ネイティブアプリの初期メモリフットプリントが大きい

(私はそれが最も有用なメトリックであると理解していますが、私はWindowsの「プライベートバイト」メジャーを参照しています)。それはそれに到達したとき、私は「メイン()」機能と案の定の最初の行にブレークポイントを配置した

は、フットプリントは20メガバイトです。

EXEのサイズはわずか2メガですので、それを考慮しません。

また、私は故意に原因ではなかったことを証明するために、すべてのDLLを意図的に削除しました。期待どおり、 "Dll not found"メッセージが表示されますが、フットプリントはまだ20MBです!

それで、私は恐らくそれが原因であった静的に初期化されたオブジェクトであるかもしれないと思った。

「new」と「malloc」の両方にブレークポイントを追加しました。最初のヒット時(最初の静的イニシャライザーの場合)、メモリーはすでに20MBです。

私はこの記憶を食べているものをどのように診断することができますか?

それはいつも新しい/ malloc関数パラダイムの外のメモリのようですので、私はデバッグする方法を理解するのに苦労しています。

乾杯、

ジョン

+1

アプリケーションについてもう少し知ることができます。あなたはあなたですか?静的データを使用しますか? – lothar

+0

あなたは「すべてのDLLを削除しました」と言います。しかし、あなたはまだシステムDLLを使っていますよね?それが問題ではないと確信していますか?場合によっては、Windowsがアプリケーション用のDLLのプライベートコピーをロードする必要があります(http://msdn.microsoft.com/en-us/library/ms811694.aspx#dlldanger1_topic2を参照)。 –

+1

私はかなりの場所で静的データを使用していますが、静的データが初期化される前にメモリフットプリントがあることを確かめています( "malloc"と "新しい"ブレークポイントから分かるように)。 メモリを使用している静的な第三者のライブラリの提案は、私にとって最も犯しやすい原因のように聞こえます。 私は本当に大量のサードパーティの静的ライブラリ(openssl、sqlite、crypto ++などを含む)を使用しています。誰も私がどのように(もしあれば)これらの食べ物をメモリ上に確立できるかについての提案はありますか? – John

答えて

3

などを使用してライブラリ何それはあなたがあなたのアプリとライブラリの多くを引っ張っていることかもしれないものの詳細をポストする必要があります。それらのほとんどは、実行がmain()に渡される前に初期化されます。リンクしている非標準ライブラリがないかどうかを確認してください。

EDIT:非常に簡単な解決策は、新しいプロジェクトを作成することと、ちょうどあなたがメモリ使用量を毎回チェックし、一つ一つを使用しているライブラリをリンクします。それは醜いアプローチですが、あなたはこのように犯人を見つける必要があります。あなたは(無料)メモリプロファイリングソリューションのためのグーグルいくつかの時間を割いしたい場合がありますので

は、そこにおそらくよりエレガントな解決策があります。

+0

良い点 - 上の主な質問のコメントを参照してください。 – John

3

あなたはデバッグ情報なしでアプリケーションをコンパイルして、これは何かを変えるかどうかを確認し、デバッグ能力が静かないくつかのメモリを食べるかもしれません。

+0

デバッグ情報が「プライベートバイト」に表示されるべきではありません。 –

+0

はい、申し訳ありませんが、リリースコードで同じ結果が得られたはずです。 – John

2

私のシステムでは、単純なMFCアプリケーションと空のDelphiアプリケーションの両方で約400Kのプライベートバイトがほぼ同じです。だからあなたのアプリが20Mbをつかんでいるなら、あなたのアプリケーションがやっていることは間違いない。あなたのアプリは、それが

+0

このアプリケーションはかなり複雑なバックアップアプリケーションで、openssl、crypto ++、sqliteなどのサードパーティのライブラリをたくさん使用しています。 私のアプリケーションだと私は確信していますが、どうしたらいいですか?私のアプリケーションで*どこを見つけるか? 「私の」コードを除外したと思うので、指は第三者のライブラリを指しています。どのようにデバッグするかについての任意のアイデア? – John

関連する問題