上にある仮想メモリサイズとはどういう意味ですか?


124

topサーバーのパフォーマンスを監視するために実行していますが、2つのJavaプロセスが最大800MB-1GBの仮想メモリを表示しています。それは悪いことですか?

仮想メモリとはどういう意味ですか?

それに、1GBのスワップがあり、使用率が0%であることがわかります。だから私は混乱しています。

Javaプロセス= 1 Tomcatサーバー+自分のJavaデーモンサーバー= Ubuntu 9.10(karmic)


回答:


142

仮想メモリは必ずしもメモリではありません。たとえば、プロセスが大きなファイルをメモリマップする場合、ファイルは実際にディスクに保存されますが、プロセスの「アドレススペース」を占有します。

アドレス空間(つまり、プロセスリスト内の仮想メモリ)には何もかかりません。それは本当ではない。本当のことは、常駐メモリであるRSS(RES)列です。これは、プロセスが実際に使用しているメモリの量です。

しかし、それでも全体の答えではありません。プロセスがfork()を呼び出すと、プロセスは2つの部分に分割され、最初は両方がすべてのRSSを共有します。したがって、RSSが最初は1 GBだったとしても、分岐後の結果は2つのプロセスになり、それぞれ1 GBのRSSを持ちますが、それでも1 GBのメモリしか使用しません。

まだ混乱していますか?本当に知っておくべきことは次のとおりです。freeコマンドを使用して、プログラムを開始する前後に(+/- buffers/cache行で)結果を確認します。その違いは、新しく起動したプログラムが使用した新しいメモリの量です。


2
「プログラムの開始前後に結果を確認する」、あるいは、から返されるUSS(Unique Set Size)を使用しsmemます。
ヒューバートカリオ

使用されているメモリの本当の量を提供するツール、サードパーティではないツールがあります。
CMCDragonkai 14

@CMCDragonkaiはい、無料です。
-deviantfan

1
Javaプロセスjava -Xmx16g RunLong用に16Gbのメモリを予約するを介してJavaプロセスを起動するVIRTと、16Gbがカウントされているように見えます。この場合、この16Gbメモリのタイプは何ですか、そのマップされたメモリまたは..?
エリックワン

1
@EricWang、そのメモリはマップされていません。これは、後で必要になる可能性のある(おそらく決して)メモリを予約するためのOSへの単なる要求です。(少なくとも)Linuxでは、これはMAP_NORESERVEフラグとPROT_NONEフラグを使用したmmap呼び出しです(os :: pd_reserve_memory呼び出しanon_mmap:github.com/AdoptOpenJDK/openjdk-jdk11u/blob/…を参照)。デフォルトではメモリは実際には割り当てられません。これは、プログラムがオブジェクト割り当て要求を満たすために実際にメモリを必要とする時点でのみ行われます。
ジュラジマルティンカ

23

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に表示されますが、実際にはメモリを消費しません。


2
それは興味深いことです。VIRT= SWAP + RESです。どうしてSWAPの使用量がゼロになり、2つのJavaプロセスの仮想メモリが1GBに近いのでしょうか。
カプソ

基本的にトップショー....スワップ:合計1048568k、0k使用、1048568k無料、505728kキャッシュ
10

15
@ user42159この答えは間違っています!男性トップには「VIRT = SWAP + RES」はありません!-m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT。私がこの答えを否定できないのは残念です。
デュレシ

3
この答えは間違っています。USED​​ = Res + Swap Size(上部のFields Managementから、上部にあるときにfキーを押してアクセスします。上部のmanページからも)。
ジェイソンS

15

ムグレル・スマナリウからのこの説明は非常に明確でした。

VIRTプロセスの仮想サイズを表します。これは、実際に使用しているメモリ、それ自体にマップされたメモリ(XサーバーのビデオカードのRAMなど)、それにマップされたディスク上のファイル(ほとんど特に共有ライブラリ)、および他のプロセスと共有されるメモリ。VIRTは、現時点でプログラムがアクセスできるメモリ量を表します。

RESは常駐サイズを表します。これは、プロセスが消費する実際の物理メモリの量を正確に表します。(これは、%MEM列にも直接対応します。)ほとんどのプログラムはCライブラリに依存しているため、これは事実上常にVIRTサイズより小さくなります。

SHRVIRTサイズのうち実際に共有可能なサイズ(メモリまたはライブラリ)を示します。ライブラリの場合、ライブラリ全体が常駐していることを必ずしも意味しません。たとえば、プログラムがライブラリ内のいくつかの関数のみを使用する場合、ライブラリ全体がマップされ、VIRTおよびSHRでカウントされますが、使用されている関数を含むライブラリファイルの部分のみが実際にロードされてカウントされますRESの下で。


「VIRTは、現時点でプログラムがアクセスできるメモリ量を表している」とだけ言い直します。「VIRTは現在のプログラムのアドレス可能なスペース全体のサイズを表します。」OK、それでもポリッシュを使用できます。しかし、ポイントは、VIRTがRAMスペースとは何の関係もない場合でも、「どのくらいのメモリ」がRAMについて議論している印象を与えることができるということです。実際、大規模なプログラムは、システムRAMの合計サイズの数倍のVIRTサイズを持つことがよくあります。これは、VIRTがほぼ完全にファイルでバックアップされたアドレス領域(別名「ディスクではなくRAM」)であるためです
FeRD

5

ps / top出力のVIRT列は、メモリ使用量の測定にはほとんど関係ありません。心配しないでください。 Apache高負荷VIRTとRESメモリ

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used


おかげで、スワップの使用率が0%であるにもかかわらず、仮想メモリの列が非常に高いため、心配して混乱しました。また、使用されている合計2.7GBの物理メモリのうち1.7GBしか使用されていませんが、仮想メモリは高いですか?
カプソ

2

Linuxは仮想メモリをサポートします。つまり、ディスクをRAMの拡張として使用して、使用可能なメモリの有効サイズがそれに応じて大きくなるようにします。カーネルは、現在使用されていないメモリブロックの内容をハードディスクに書き込み、メモリを別の目的に使用できるようにします。元のコンテンツが再び必要になると、それらはメモリに読み戻されます。これはすべてユーザーに対して完全に透過的に行われます。Linuxで実行されているプログラムは、使用可能なメモリの大容量のみを認識し、その一部がディスク上にあることに気付かないことがあります。もちろん、ハードディスクの読み取りと書き込みは、実際のメモリを使用するよりも遅い(1000倍のオーダー)ので、プログラムはそれほど速く実行されません。仮想メモリとして使用されるハードディスクの部分は、スワップ領域と呼ばれます。

Linuxは、ファイルシステム内の通常のファイルまたはスワップスペース用の別のパーティションを使用できます。スワップパーティションは高速ですが、スワップファイルのサイズを変更する方が簡単です(ハードディスク全体を再パーティションし、場合によってはすべてを最初からインストールする必要はありません)。必要なスワップスペースの量がわかったら、スワップパーティションを探す必要がありますが、不確かな場合は、最初にスワップファイルを使用し、しばらくの間システムを使用して、どのくらいのスワップスペースがあるかを感じてください。必要な場合は、そのサイズに自信があるときにスワップパーティションを作成します。

また、Linuxでは複数のスワップパーティションやスワップファイルを同時に使用できることも知っておく必要があります。これは、たまに異常な量のスワップスペースが必要な場合に、常に全量を割り当てずに、そのようなときに余分なスワップファイルをセットアップできることを意味します。

オペレーティングシステムの用語に関する注意:コンピューターサイエンスでは、通常、スワッピング(プロセス全体をスワップスペースに書き込む)とページング(一度に固定サイズの部分、通常は数キロバイトのみを書き込む)を区別します。通常、ページングは​​より効率的であり、それがLinuxの機能です。しかし、従来のLinuxの用語では、とにかくスワップについて説明しています。

ソース:http : //www.faqs.org/docs/linux_admin/x1752.html


1
この答えは、仮想メモリがスワッピングまたはページングと同じであるという誤解を広めます。RAMの拡張としてディスクを使用すると、仮想メモリよりも前になります。また、仮想メモリを備えているがRAMの拡張としてディスクを使用しないシステム(ほとんどのSoHoルーターなど)が多数あります。(そして、彼はスワップを使用していないので、OPの質問に対する答えでもありません。)
デイビッドシュワルツ

2

VIRtual上部の列は、プロセスのスーパースペース(スーパー消費スペース)を指します。これは、プロセスが実行時に実際に使用していない可能性があります。RESident実行時にプロセスによって割り当てられた実際の物理メモリ/スペースを参照する別の列があります。

この2つの違いの理由は、例によって理解できます。プロセスが特定のライブラリを使用している場合、ライブラリサイズもに役立ちvirtual-sizeます。ただし、ライブラリの一部のみが使用されるため(つまり、使用中のいくつかのメソッド)、そのために役立ちresident-sizeます。

詳細情報を参照してください


0

「VIRT」は単なるアドレス空間であり、RESは「実際の」メモリですが、「SHR」(=共有)量の「RES」は、他のプロセスと共有されるRESの一部です。したがって、ほとんどのプロセスでは、RESからSHRを引くことで、この特定のプロセスに実際に起因するメモリ量が得られると考えています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.