問題タブ [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.
memory - Erlang メモリの断片化
私たちの Erlang サーバーには深刻なメモリ リークがあるようです。VM のメモリ使用量は低いですが、トップは高いです。
環境
Erlang: R16B02
OS: Ubuntu 12.04.5 LTS \n \l X86_64
アーラン VM
割り当てられたメモリ
バイナリを割り当てる
ごみをする
断片化
そして、確認するrecon_alloc:fragmentation(current)
とrecon_alloc:fragmentation(max)
、一部のアロケーターの現在の使用量が最大使用量よりも低いことがわかりました。
現在の使用状況
最大使用量
Erlangサーバーには多くのメモリの断片化があり、どうすれば先に進むことができますか?
vb.net - メモリの断片化を気にせずにファイルを送信するには?
ユーザーがサーバーのハード ドライブに特定のファイルをダウンロードできるようにする単純な VB.NET Web アプリケーションがあります。ただし、これらのファイルの一部は非常に大きく、サイズは最大 1GB です。Web アプリケーションがこれらのファイルを送信しようとすると、アプリケーションがクラップアウトしてSystem.OutOfMemoryException
. いくつかの調査の結果、これはメモリの断片化が原因であるか、ファイル全体に割り当てるのに十分な連続メモリがないことがわかりました。
このエラーの発生を回避する方法はありますか? 私たちのサーバーには、これらの大きなファイルをダウンロードするために割り当てるのに十分な物理メモリが全体的にあります。これは、単にメモリの断片化の問題です (とにかくインターネットで読んだことから)。
参考までに、現在配置されているコードは次のとおりです。
... ここfileName
で、 はファイルの名前、contentType
は MIME タイプ、fileLocation
はディスク上の物理的な場所です。
助言がありますか?
c# - string.Format ではなく、文字列を連結または追加するときのメモリの断片化?
string.Format
そのため、大学の教授は、C# で文字列を連結すると (つまり、プラス記号演算子を使用すると) メモリの断片化が発生するため、代わりに使用する必要があると教えてくれました。
今、私はスタック オーバーフローで多くの検索を行い、パフォーマンスに関する多くのスレッドを見つけました。これは、文字列の連結が圧倒的に有利です。(一部には、これ、これ、およびこれが含まれます)
ただし、メモリの断片化について話している人は見つかりません。string.Format
ILspy を使用して.NET を開いたところ、メソッドと同じ文字列ビルダーを使用しているようです (符号がオーバーロードされてstring.Concat
いることを理解していれば)。+
実際: string.Concat
!のコードを使用します。
この記事は 2007 年に見つけましたが、今日 (またはこれまでも) 正確であるとは思えません。どうやらコンパイラは今日それを避けるのに十分賢いので、問題を再現できないようです。string.format とプラス記号を使用して文字列を追加すると、内部的に同じコードが使用されます。前に述べたように、string.Format は string.Concat が使用するのと同じコードを使用します。
だから今、私は彼の主張を疑い始めている. 本当ですか?
c - メモリの断片化
malloc()
s とs をランダムにネストして異なるサイズで使用するfree()
と、ある時点でメモリが断片化されます。これは、これらの操作により、連続していない小さなメモリ領域の大きなリストが残るため、1 つの大きなピースとして割り当てることができないためです。 .
これに関するいくつかの質問:
これが非常に頻繁に行われ、メモリが強制的に断片化され、これらのメモリ領域がすべて
free()
削除される場合、これらの空き領域が元の連続したサイズに連結されていると想定できますか?同じメモリに対して常に
malloc()
後続の呼び出しを実行free()
し、これらの呼び出しをネストしない場合、割り当て/解放されたサイズが常に異なる場合、このシナリオでもメモリが断片化されますか?
json - Arduino Mega は 4 時間後に遅くなります
Web サーバーに POST リクエストを送信し、サーバーの応答に基づいていくつかのタスクを実行する小さなプロジェクトを作成しています。サーバーは常に JSON または配列で応答します
サーバーからの従来の応答は次のようになります。
問題は、完璧に 4 時間実行した後、arduino メガの実行速度が非常に遅くなることです。最初は、コマンドを取得してタスクを実行するのに 10 ~ 20 ミリ秒しかかかりません (LED の電源を入れます)。現在、4時間後、同じLEDに電力を供給するのに約5秒かかります. イーサネットの LED がゆっくりと点滅しているのを見ました。サーバーの応答を保存するために const char* を使用したためだと思います。私の質問は、ループ関数の最後で、const char* のような変数が削除されるということですか? 私のarduinoが数時間後にとてもゆっくりと動くのは何ですか? ありがとう
ループ関数で実行されるコード:
tcp レスポンスからヘッダーを削除する機能
memory-management - 外部の断片化に対処する方法、ページングが外部の断片化にどのように役立つか?
ここで指摘している問題に関して多くの質問があることは知っていますが、複雑な答えは見つかりませんでした (StackOverflow でも他のソースでも)。
ヒープ (RAM) の断片化の問題についてお聞きしたいと思います。
内部- アロケーション ユニット サイズ (AU) と割り当てられたメモリ AM (無駄なメモリは AM % AU に等しい) のサイズの違いに関連し、 外部 -フリーの非連続領域に関連します。したがって、空きメモリ領域の合計が新しい割り当て要求を処理できる場合でも、それを処理できる継続領域がない場合は失敗します。
これは非常に明確です。「ページング」が表示されると、問題が発生します。
ページングが外部フラグメンテーションの問題を解決するという情報を見つけることがあります。実際、ページングのおかげで、メモリの一部が物理的に散らばっていても、OS がプロセスに割り当てられたメモリの実質的に連続した領域を作成できることに同意します。
しかし、それは外部の断片化にどのように役立つのでしょうか? つまり、ページのサイズが 4kB で、16kB を割り当てたいと仮定すると、物理的にフレームが継続領域の一部でなくても、4 つの空のページ フレームを見つける必要があるだけです。
しかし、より小さな割り当ての場合はどうなるでしょうか? ページ自体はまだ断片化されている可能性があり、(最悪の場合) 古いフレームを使用して要求されたメモリを割り当てることができない場合、OS は新しいフレームを提供する必要があると思います。
それで、(最悪の場合を想定して)遅かれ早かれ、ページングの有無にかかわらず、ヒープメモリ(異なるサイズ)を割り当てて解放する長時間動作するアプリケーションは、外部の断片化のためにメモリ不足の状態に陥りますか?
問題は、外部の断片化にどのように対処するかです。 割り当てアルゴリズムの独自の実装? ページング(私が書いたように、それが役立つかどうかはわかりません)?ほかに何か ?OS (Windows、Linux) にはデフラグ方法がありますか?
最も根本的な解決策は、ヒープの使用を禁止することですが、ページング、仮想アドレス空間、仮想メモリなどを備えたプラットフォームにヒープが本当に必要でしょうか...そして唯一の問題は、アプリケーションを何年も止められずに実行する必要があることですか?
もう1つの問題..内部フラグメンテーションはあいまいな用語ですか? 内部フラグメンテーションがページフレームの一部を指しているという定義をどこかで見つけました。これは、プロセスがより多くのメモリを必要としないために無駄になりますが、単一のフレームを複数のプロセスが所有することはできません。
急いでいる人がすべてを読まなくても質問を見つけられるように、質問を太字にしています。
よろしく!
memory-management - 内部フラグメンテーションの基本的な考え方
50 バイトのプロセスが 2 つあり、100 バイトのパーティションが 1 つしかないとします。最初のプロセスがパーティションを占有し、50 バイトが残っているとします。空き容量がある場合でも、2 番目のプロセスを同じパーティションに配置できますか? または内部の断片化が発生しますか?
また、内部の断片化が存在する場合、外部の断片化も存在するというのは本当ですか?