問題タブ [memory-fragmentation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - LOH への断片化を引き起こす文字列を回避する方法
私のアプリケーションは、最終的に断片化の問題を引き起こす大きなオブジェクト ヒープに入るテキスト ファイルから大量のデータを読み取ります。これらを LOH に到達させないようにするための代替設計アプローチはありますか? StringBuilder については知っていますが、テキスト ファイルから読み取ると、内部的に大きな文字列が LOH に作成されるようです。
memory-leaks - クラッシュ ダンプ内の過剰な Gen 2 フリー ブロック
クライアントから報告されたメモリ不足の例外についてクラッシュ ダンプ ファイルを検査した結果、!DumpHeap -stat
575MB のメモリが 45,000 個の「フリー」タイプのオブジェクトによって占有されていることが示されました。サイズ。
最初に問題を探したのは、ラージ オブジェクト ヒープ (LOH) と固定されたオブジェクトでした。空き領域を含む大きなオブジェクト ヒープは 70MB しかないため、これは問題ではなく、実行すると!gchandles
次のように表示されました。
これは、空きオブジェクトの数 (45,000) に比べて非常に少ない数のハンドル (約 600) です。私には、これにより、ピン留めによって引き起こされる空きブロックが除外されます。
また、空きブロック自体も調べて、サイズが一貫しているかどうかを確認しましたが、調べたところ、サイズは大きく異なり、5MB 弱からわずか 12 バイト程度までありました。
どんな助けでも大歓迎です!断片化があるため途方に暮れていますが、ラージ オブジェクト ヒープ (LOH) と固定ハンドルの 2 つの場所が原因であるという兆候は見られません。
c - 割り当てることができるメモリの最大の利用可能なチャンクを取得する方法は?
malloc
アプリケーションが返さずに 1 回の呼び出しで割り当てることができる最大サイズ (連続) をバイト単位で取得するにはどうすればよいout of memory
ですか? (利用可能な最大のチャンク)
PS: 割り当てたい場合と割り当てたくない場合の両方について、一般的な回答をお願いします (したがって、この質問を再質問する必要はありません)。
c# - SharpDX メモリの断片化
SharpDX を使用してタイル張りの 2D 画像をレンダリングする .NET 3.5 アプリケーションに取り組んでいます。
テクスチャ (Texture2D) はオンデマンドでキャッシュに読み込まれ、マネージド プールに作成されます。
テクスチャは不要になると破棄され、Dispose() が正しく呼び出されることを確認しました。SharpDX オブジェクト トラッキングは、ファイナライズ中のテクスチャがないことを示します。
問題は、テクスチャによって使用される大量のアンマネージ ヒープ メモリが、破棄後も引き続き予約されることです。このメモリは新しいテクスチャをロードするときに再利用されるため、メモリ リークは発生しません。
ただし、アプリケーションの別の部分でも、新しい画像を処理するためにかなりの量のメモリが必要です。これらのヒープはまだ存在しているため、テクスチャが破棄されても、別のイメージをロードするための十分な連続メモリがありません (数百 MB になる可能性があります)。
を使用してアンマネージ メモリを割り当てるAllocHGlobal
と、結果のヒープ メモリは を呼び出した後に完全に消失しますFreeHGlobal
。
VMMap は、アプリケーションを頻繁に使用した後、管理されていないヒープ (赤) を示します。
この時点で実際にコミットされているのは約 20MB だけですが、管理されていないヒープが約 380MB を占めていることがわかります。
長期的には、アプリケーションは 64 ビットに移植されています。ただし、管理されていない依存関係があるため、これは簡単なことではありません。また、すべてのユーザーが 64 ビット マシンを使用しているわけではありません。
編集:この問題のデモをまとめました - WinForms アプリケーションを作成し、Nuget 経由で SharpDX 2.6.3 をインストールします。
Form1.cs:
SharpDXRenderer.cs:
したがって、私の質問は - (どのように) テクスチャが破棄された後、これらのアンマネージ ヒープによって消費されたメモリを再利用できますか?
linux - 物理メモリが 2^20 バイトでページ サイズが 4KB の 32 ビット システムでページ フレーム番号に必要なビット数は?
物理メモリが 2^20 バイトでページ サイズが 4KB の 32 ビット システムでページ フレーム番号に必要なビット数は?
11ビットですか??
答えが必要です 助けてください! ありがとうございました。
c++ - multi_index_container とメモリの断片化を促進する
サーバーの LRU キャッシュに MIC を使用しています。これが原因で説明できないメモリ フットプリントが発生したのではないかと疑っていたため、リスト/マップ LRU を MIC に置き換えました。メモリ リークは把握できていません。少なくとも、コード インスペクションだけでなく、リークを検出したツールはありません。MIC を使い始めてから画像は改善されましたが (メモリの断片化の唯一の証拠です)、十分ではありませんでした。私たちは、数 Gb のキャッシュについて話しており、毎日何百万ものレコードがそこから排出されています。2 ~ 3 週間後、問題が明らかになりました。キャッシュを空にすると、プロセスはまだ原因不明の 2 ~ 3Gb のメモリを保持しています。
私のコンテナはとてもシンプルです:
erase
andを使用しpush_front
て新しいエントリを挿入 (または古いエントリを上書き) し、必要に応じて末尾から要素を取り出します。replace
問題は、 andrelocate
の代わりにpush_front
?を使用する価値があるかどうかです。
UPDATE001: OK、新しいバージョンが稼働中です。再割り当てによって状況が大幅に改善されたことがわかりました。3 週間後のメモリ フットプリントは、変更を加えていないマシンのフットプリントよりも 1/1.5 Gb 小さくなりました。現在、世界中のすべてのマシンに展開されています。第 2 段階として、キャッシュ無効化機構に多数の変更があります。排出と再挿入を減らすと、状況も改善されるはずです (実際にメモリの断片化が発生している場合)。
android - totalMemory が小さいのに、totalPss が非常に大きいとはどういう意味ですか?
アプリに問題があります。時間の経過とともに、totalPss
値が非常に大きくなることに気付きました (デバイスによっては、300 ~ 700Mb になります)。
以下は、典型的な実行の結果を示すグラフです。
しかし同時に、totalMemory
値が非常に大きくなることはありません (最大で 40 ~ 50Mb ですが、GC 後は 10Mb に低下します)。
以下は、上記と同じ実行結果を示すグラフです (単位は無視してください。実際にはバイト単位です)。
getMemoryClass
このデバイスの場合、アプリで使用できる 192Mb があることを示します。
私たちのメモリ使用パターンは、頻繁に解放される時間の経過とともに多数の大きな割り当てを行うことです。これが長時間続くと、大規模な割り当てが失敗し、通常はアプリが失敗します。
おそらくフラグメンテーションが発生しているようですが、これは正しいと思いますか? 属性を使用してこれを解決できますかlargeHeap
(私の直感では解決できないと思います)。これをより確実に診断するのに役立つツールはありますか?