回答:
仮想メモリは必ずしもメモリではありません。たとえば、プロセスが大きなファイルをメモリマップする場合、ファイルは実際にディスクに保存されますが、プロセスの「アドレススペース」を占有します。
アドレス空間(つまり、プロセスリスト内の仮想メモリ)には何もかかりません。それは本当ではない。本当のことは、常駐メモリであるRSS(RES)列です。これは、プロセスが実際に使用しているメモリの量です。
しかし、それでも全体の答えではありません。プロセスがfork()を呼び出すと、プロセスは2つの部分に分割され、最初は両方がすべてのRSSを共有します。したがって、RSSが最初は1 GBだったとしても、分岐後の結果は2つのプロセスになり、それぞれ1 GBのRSSを持ちますが、それでも1 GBのメモリしか使用しません。
まだ混乱していますか?本当に知っておくべきことは次のとおりです。free
コマンドを使用して、プログラムを開始する前後に(+/- buffers/cache
行で)結果を確認します。その違いは、新しく起動したプログラムが使用した新しいメモリの量です。
smem
ます。
java -Xmx16g RunLong
用に16Gbのメモリを予約するを介してJavaプロセスを起動するVIRT
と、16Gbがカウントされているように見えます。この場合、この16Gbメモリのタイプは何ですか、そのマップされたメモリまたは..?
top(1)のマニュアルページから:
o: VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It
includes all code, data and shared libraries plus pages that
have been swapped out.
VIRT = SWAP + RES.
RESは常駐メモリ(使用される物理メモリ)を意味します。
実際、それは正しくありません(もう)。「スワップ」と表示されている場合、プログラムがそのアドレス空間にマップしたファイルも含まれますが、実際にはまだ実際のRAMを消費している場合とそうでない場合があります。このメモリはファイルベースですが、実際にはスワップではありません。
VIRTには、割り当てられているがまだ何にも使用されていないページも含まれます。この状態のページはすべて、カーネルゼロページにマップされます(優れたコンセプト-調べる必要があります)。VIRTに表示されますが、実際にはメモリを消費しません。
-m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT
。私がこの答えを否定できないのは残念です。
ムグレル・スマナリウからのこの説明は非常に明確でした。
VIRT
プロセスの仮想サイズを表します。これは、実際に使用しているメモリ、それ自体にマップされたメモリ(XサーバーのビデオカードのRAMなど)、それにマップされたディスク上のファイル(ほとんど特に共有ライブラリ)、および他のプロセスと共有されるメモリ。VIRTは、現時点でプログラムがアクセスできるメモリ量を表します。
RES
は常駐サイズを表します。これは、プロセスが消費する実際の物理メモリの量を正確に表します。(これは、%MEM列にも直接対応します。)ほとんどのプログラムはCライブラリに依存しているため、これは事実上常にVIRTサイズより小さくなります。
SHR
VIRTサイズのうち実際に共有可能なサイズ(メモリまたはライブラリ)を示します。ライブラリの場合、ライブラリ全体が常駐していることを必ずしも意味しません。たとえば、プログラムがライブラリ内のいくつかの関数のみを使用する場合、ライブラリ全体がマップされ、VIRTおよびSHRでカウントされますが、使用されている関数を含むライブラリファイルの部分のみが実際にロードされてカウントされますRESの下で。
ps / top出力のVIRT列は、メモリ使用量の測定にはほとんど関係ありません。心配しないでください。 Apache高負荷VIRTとRESメモリ
Linuxは仮想メモリをサポートします。つまり、ディスクをRAMの拡張として使用して、使用可能なメモリの有効サイズがそれに応じて大きくなるようにします。カーネルは、現在使用されていないメモリブロックの内容をハードディスクに書き込み、メモリを別の目的に使用できるようにします。元のコンテンツが再び必要になると、それらはメモリに読み戻されます。これはすべてユーザーに対して完全に透過的に行われます。Linuxで実行されているプログラムは、使用可能なメモリの大容量のみを認識し、その一部がディスク上にあることに気付かないことがあります。もちろん、ハードディスクの読み取りと書き込みは、実際のメモリを使用するよりも遅い(1000倍のオーダー)ので、プログラムはそれほど速く実行されません。仮想メモリとして使用されるハードディスクの部分は、スワップ領域と呼ばれます。
Linuxは、ファイルシステム内の通常のファイルまたはスワップスペース用の別のパーティションを使用できます。スワップパーティションは高速ですが、スワップファイルのサイズを変更する方が簡単です(ハードディスク全体を再パーティションし、場合によってはすべてを最初からインストールする必要はありません)。必要なスワップスペースの量がわかったら、スワップパーティションを探す必要がありますが、不確かな場合は、最初にスワップファイルを使用し、しばらくの間システムを使用して、どのくらいのスワップスペースがあるかを感じてください。必要な場合は、そのサイズに自信があるときにスワップパーティションを作成します。
また、Linuxでは複数のスワップパーティションやスワップファイルを同時に使用できることも知っておく必要があります。これは、たまに異常な量のスワップスペースが必要な場合に、常に全量を割り当てずに、そのようなときに余分なスワップファイルをセットアップできることを意味します。
オペレーティングシステムの用語に関する注意:コンピューターサイエンスでは、通常、スワッピング(プロセス全体をスワップスペースに書き込む)とページング(一度に固定サイズの部分、通常は数キロバイトのみを書き込む)を区別します。通常、ページングはより効率的であり、それがLinuxの機能です。しかし、従来のLinuxの用語では、とにかくスワップについて説明しています。
VIRtual
上部の列は、プロセスのスーパースペース(スーパー消費スペース)を指します。これは、プロセスが実行時に実際に使用していない可能性があります。RESident
実行時にプロセスによって割り当てられた実際の物理メモリ/スペースを参照する別の列があります。
この2つの違いの理由は、例によって理解できます。プロセスが特定のライブラリを使用している場合、ライブラリサイズもに役立ちvirtual-size
ます。ただし、ライブラリの一部のみが使用されるため(つまり、使用中のいくつかのメソッド)、そのために役立ちresident-size
ます。
詳細情報を参照してください