問題タブ [heap-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.
c - 64 ビット プラットフォーム上の GCC での基本的なヒープ使用統計
GCC for Linux でコンパイルされた C プログラム内からの基本的な質問に答える必要があります。現在使用中のプロセス ヒープの量 (によって割り当てられているmalloc
) と、空きヒープがブロックされている場合に存在する量です。標準ライブラリの GNU 実装にはmallinfo
、必要なものを正確に報告する関数がありますが、32 ビット構成でのみ使用でき、AFAIK では、その機能に相当する 64 ビットはありません (ところで、誰もが理由を知っていますか?)。
LinuxでGCCを使用しているため、Linuxにはこれが必要です。ただし、ヒープはシステムに対して不透明であると想定しているため、この質問に答える唯一の方法は、標準ライブラリの実装によって提供される手段を使用することです。
Windows プラットフォームでの MSVC の実装には関数に相当するものはありませんmallinfo
が、いわゆるヒープ ウォーク機能があり、ヒープ内のすべてのブロックを反復処理して必要な情報を計算できます。私の知る限り、GNU C ライブラリにはヒープ ウォーク インターフェイスはありません。(ある?)。
繰り返しになりますが、GCC で何をすればよいのでしょうか。効率的である必要はありません。つまり、前述のヒープ ウォーク ベースのアプローチは、私にとってはまったく問題なく機能します。GCC で使用中のヒープの量と空きの量を調べるにはどうすればよいですか? mallinfo.arena
を使用せずに現在のヒープ アリーナ サイズ (「参考文献」を参照)を判断する方法はわかりませんが、おそらく malloc-hooks をインストールしてサイズを「手動で」追跡することができますmallinfo
。
c - メモリとポインタ
タスクについて考えるのに助けが必要です。
私のタスクは、1 つのメモリ領域を作成することです。
次に、ポインタを使用してテキストをこの格納場所に格納します。この領域を 32 バイトのデータ ブロックに分割したいので、格納できます: 320/32 = 10 データ ブロック a 32 バイト。1 つのデータ ブロックに (1 ASCSII 文字 = 1 バイト) 32 文字を格納できます。
データ ブロックが使用されているか (1) 使用されていないか (0) をすべてのビットが示す長さ 10 のビットマップがあります。
しかし、60 文字のテキストを保存したい場合はどうすればよいでしょうか? 次に、2 つのデータ ブロック (2 x 32 バイト) が必要です。ビットマップは、データ ブロック 2 と 6 がフリーであり、1 と 6 が並んでいないことを示しています。どうすればこれを達成できますか?
c - 連続メモリブロックとは何ですか?
タイトルの通り、連続メモリブロックとは?
garbage-collection - 特定の状況でのガベージコレクション
私はガベージコレクションの基本とそれぞれのさまざまなアルゴリズム(およびプロの短所など)を使用しています。さまざまなシナリオで使用するのに最適なガベージコレクションアルゴリズムを決定しようとしています。
例:同じサイズのヒープ上のすべて、短い寿命の小さなすべて、長い寿命の大きなすべて。
-すべてが同じサイズの場合、ヒープの断片化は問題になりません。また、圧縮について心配する必要はありません。それで、多分参照カウント?
-寿命の短い小さなオブジェクト?
-より長い寿命を持つ大きなオブジェクト?(おそらく寿命のために世代別)
私が見ているのは、参照カウント、マーク&スイープ、ストップ&コピー、ジェネレーションです。
ios - iPad のランタイム メモリはどこに行くのですか?
デバイス (iPad) のメモリが不足しているように見えるため、アプリを投棄しています。Instruments が私が約 80Mb を使用していて、デバイス上で他のアプリが実行されていないことを示しているため、何が起こっているのかを理解しようとしています。
iOS の Mach システムにメモリ統計を要求する次のコード スニペットを見つけました。
この関数を使用して 3 つのメモリ値を取得すると、mem_used の合計がそれほど変化していなくても、mem_total の値がかなり下がっていることがわかります。2 つの連続した出力行を次に示します。
いくつかのコードが実行されます....
つまり、157MB の空きメモリから 10MB の空きメモリに一気に移動しましたが、使用量は 78MB から 84MB にしか増加しませんでした。合計メモリは 236MB から 94MB に減少しました。
これは誰にとっても意味がありますか?この期間中、デバイスで実行されている他のアプリケーションはありません。デバイスは基本的に完全に私のアプリケーション専用である必要があります。
2 つのメモリ チェックの間に実行されるコードはすべてネイティブ C++ コードであり、Apple フレームワークとはまったく対話しません。実際、C++ ヒープからオブジェクトを割り当ておよび割り当て解除するためのメモリ システムへの呼び出しは非常に多くありますが、見られるように、最終的に割り当てられるのは約 4MB の追加メモリのみであり、残りはすべて解放/削除されます。
不足しているメモリがヒープの断片化によって消費されている可能性がありますか? つまり、ヒープが単純に断片化されているため、ブロックのオーバーヘッドが追加の未確認のメモリをすべて消費しているのでしょうか?
他の誰かがこの動作を見たことがありますか?
ありがとう、
-エリック
debugging - マネージ ヒープの断片化
ヒープの断片化がどのように機能するかを理解しようとしています。次の出力は何を示していますか?
このヒープは過度に断片化されていますか?
合計 53304764 バイトの 243010 個の「空きオブジェクト」があります。かつてオブジェクトを含んでいたが、現在はガベージ収集されているヒープ内の「空きオブジェクト」スペースはありますか?
断片化されたヒープを強制的にクリーンアップするにはどうすればよいですか?
memory - 書式設定されたテキストをメモリ内で表現する最良の方法は? C++
私は基本的なテキスト エディターを作成しています。実際には、メイン プログラムのコード、数値、および式を記述したい編集コントロール ボックスです。
私が現在行っている方法は、文字列をエディット コントロールにフィードすることです。エディット コントロールには、文字列を単語、数字、改行、タブ、フォーマット トークンなどの「グリフ」に分割するクラスがあります。たとえば、単語グリフには、リテラル ワードを表す文字列と、それを表す短い整数が含まれます。末尾の空白の数。グリフには、テキストを描画して行の折り返しを計算するときに必要な情報も含まれています。
たとえば、テキスト行「私の名前はカール」は、次のようなグリフのリンクされたリストと等しくなります。 whitespace ) → WordGlyph (“Karl”, 0 whitespace) → NULL.
そのため、文字列を char (または WCHAR) の連続ブロックとしてメモリに格納する代わりに、多数の小さな割り当てと割り当て解除が行われる可能性のある小さなチャンクに格納されます。
私の質問は; この方法で行う場合、ヒープの断片化に注意する必要がありますか? これをより効率的にするためのヒントはありますか?それとも全く違うやり方?:)
PS。私はWin7でC++で作業しています。
c - 断片化を学習するために意図的にすべてのメイン メモリを浪費する
私のクラスでは、課題があり、質問の 1 つに次のように記載されています。
C でのメモリの断片化: 次のことを行う C プログラムを設計、実装、および実行します。それぞれのサイズが 500000 要素の 3m 配列のシーケンスにメモリを割り当てました。次に、すべての偶数番号の配列の割り当てを解除し、それぞれ 700000 要素のサイズの一連の m 個の配列を割り当てます。プログラムが最初のシーケンスと 2 番目のシーケンスの割り当てに必要な時間を測定します。プログラムで使用できるメイン メモリをすべて使い果たすように、m を選択します。タイミングを説明する
これの私の実装は次のとおりです。
これをいくつかの異なる方法で変更しましたが、最初に 3*m*500000 要素配列にメモリを割り当てると、使用可能なメイン メモリがすべて使用されるという一貫性が見られます。しかし、それらを解放するように指示しても、メモリはOSに解放されないため、m * 700000要素配列を割り当てるときに、ページファイル(スワップメモリ)でそれを行うため、実際にはメモリの断片化は表示されません.
上記のコードはこれを 1000 回実行して平均化しますが、かなり時間がかかります。最初のシーケンスの平均には 2.06913 秒、2 番目のシーケンスには 0.67594 秒かかりました。2 番目のシーケンスは、断片化がどのように機能するかを示すのに時間がかかると思われますが、スワップが使用されているため、これは発生しません。これを回避する方法はありますか、それとも私の仮定が間違っていますか?
月曜日に持っているものについて教授に尋ねますが、それまでは何か助けていただければ幸いです.
ios - iOS でヒープの断片化を回避する方法
私たちのアプリは、実行中にたくさんの小さなオブジェクトを作成します。ほとんどの場合、Autoreleased NSString および NSNumber オブジェクトに帰着します。アプリはバックグラウンドで「24 時間 365 日」実行するように設計されているため、ヒープの断片化が大きな問題になります。
プログラムを完全に再構築せずにそれを回避する手法は何ですか。
私は考えていました:-最終リリース後にオブジェクトをプールに戻すオブジェクトプールですが、オブジェクトは変更可能である必要があります。(NSMuttableString はそれ自体でヒープの断片化を引き起こしますか?)
他の人はこの問題にどのように対処していますか?
編集:これが、メモリの断片化に疑わしい方法です。rpages と [vm-pageshortage] を見てください。
c - Linux ヒープの断片化
先週ずっと気になっていた質問があります。
Windows デバッガーには!heap -s
、仮想メモリのヒープ ステータスを出力し、次の式を使用して外部フラグメンテーションを計算するコマンドがあります。
効果を計算するために必要な統計を出力する、Linux に同様の方法はありますか?
長い話: 私は、malloc と free を使用して、異なるサイズのスペースの割り当てと割り当て解除を続ける C アプリケーションを持っています。各割り当てには異なる寿命があります。私が使用しているプラットフォームは Lubuntu なので、ptmalloc2
algorithm がデフォルトです。
これらの割り当ては仮想ユーザー空間ヒープで提供され (アロケーターが使用する 128Kb を超えるものを除くmmap
)、実際にアクセスされたときに物理ページにマップされることを認識しています。割り当ての大部分は 80 バイト未満のサイズであるため、FastBins から提供されます。
を使用するValgrind
とMassif
、各割り当てに使用される余分なバイトが報告されるため、内部の断片化を取得できます。
ただし、私の主な関心事は、外部の断片化をどのように把握するかです。/proc/[pid]/smaps
ヒープ サイズと統計は認識していますpmap-d[pid] anon
が、それらを外部の断片化という観点から解釈するのは難しいと思います。
も認識しておりLD_PRELOAD
、動的に接続できます/lib/i386-linux-gnu/libmemusage.so
。このライブラリは、ヒープの合計、ピーク、および要求された割り当てサイズの分布を出力します。
私はそれが現在非推奨であることを知っており、や__malloc__hook
のような実装固有の統計に本当に依存したくありません。ただし、これらの 2 つを使用する提案があれば教えてください。malloc_stats()
mallinfo()
外部の断片化の問題は、ヒープに連続したスペースがないために要求を満たすことができない場合ですが、要求された合計サイズがその領域全体に散らばっていることがわかります。
この効果を計算できるように、必要な統計を取得する方法はまだわかりません。たとえば、 をキャプチャする、 をlive_memory
取得するtotal_free_pages
、または のサイズを取得する必要があることを示すさまざまな式largest_free_block
。ヒープを「トラバース」してそれらの統計を収集する機能をどのように持つことができますか?
よろしくお願いします。