アプリケーションの仮想バイトは、プライベート バイトの 2 倍になります。
これはメモリリークを示していますか?アプリケーションの設計が悪い?
OSは32Bit
どんな考えでも大歓迎です。アプリケーションはストリーム データベースです。
アプリケーションの仮想バイトは、プライベート バイトの 2 倍になります。
これはメモリリークを示していますか?アプリケーションの設計が悪い?
OSは32Bit
どんな考えでも大歓迎です。アプリケーションはストリーム データベースです。
アプリケーションの仮想バイトは、プライベート バイトの 2 倍になります。
アプリケーションがヒープのみを割り当てる場合、私にとっては、アプリケーションが大量のメモリを割り当てているが、実際には触れていないという兆候です。例えば:
void *p = malloc( 16u<<20 );
16MB の仮想メモリを消費します。ただし、アプリケーションがメモリ ブロックでアクションを実行しない限り、OS は仮想メモリを RAM にマップしようとさえしません。プライベート メモリの実際の割り当てを強制する最も簡単な方法は、 memset() です。
void *p = malloc( 16u<<20 );
memset( p, 0, 16u<<20 );
これはメモリリークを示していますか?アプリケーションの設計が悪い?
または両方。またはどちらでもない。
応答の長いバリアント: 不明。アプリケーションが割り当てるメモリ、アプリケーションが使用するその他のリソース、OS、ハードウェア プラットフォームなどによって異なります。
不明な場合は、 valgrindなどのメモリ リーク分析ツールを使用して調査します。C++ でのメモリ リーク解析の詳細については、SO を参照してください。
断片化。
次のメモリ チャンクを割り当てる場合:
次に、8KB のチャンクを解放すると、アプリケーションは 32KB のプライベート バイトを持ちますが、実際には 40KB バイトの仮想メモリを持ちます。これは、実際にはプロセスで使用された仮想メモリ アドレスの最大値です (他のメモリ部分は無視します)。簡単にするために)。
(可能であれば) 別のメモリ マネージャーの使用を検討してください。いくつかの代替手段は次のとおりです。
4 番目の方法は、独自のメモリ マネージャーを作成することです。そんなに簡単ではありませんが、正しく行えば、かなりの利益を得ることができます。特に、特定のニッチなアプリケーションや特別なアプリケーションでは、独自のメモリ マネージャーを作成すると便利です。
メモリ割り当てには、割り当てられたものに関する管理情報を格納するためのオーバーヘッドがあります。非常に小さなバッファーを割り当てている場合、余分な情報が全体のかなりの割合になる可能性があります。それはあなたが見ているものかもしれません。
1 つの可能性は、リンカー オプション /STACK:reserve_bytes を使用してスレッドに大きなスタック予約サイズを設定してから、多数のスレッドを開始した場合です。
たとえば、ATL サービスがある場合、デフォルトで 4*numberOfCores アパートメント メッセージ ディスパッチ スレッドが自動的に開始されます。このようなサービスをコンパイルして /STACK:12000000 (12 メガバイト) でリンクし、16 コア サーバーで実行すると、それぞれ 12 MB のスタックを持つ 64 のスレッドが開始され、すぐに 768 MB の仮想アドレス空間が消費されます。メモリが大幅に低下する可能性があります。