プログラムは700以上のスレッドを起動しましたが、私の/proc/[PID]/status
ファイルには次の出力が表示されます。
VmPeak: 7228104 kB
VmSize: 7228104 kB
VmLck: 0 kB
VmHWM: 3456 kB
VmRSS: 3456 kB
VmData: 7222340 kB
VmStk: 88 kB
VmExe: 4 kB
VmLib: 1540 kB
VmPTE: 2864 kB
StaBrk: 15e84000 kB
Brk: 15ec6000 kB
StaStk: 7fff765095a0 kB
Threads: 706
ただし、2GBのRAMと4GBのスワップスペースしかありません。仮想メモリがどのように7GB以上に達するかを教えてくれる人はいますか?
ベストアンサー1
一部の要求ページング仮想メモリシステムでは、オペレーティングシステムは、匿名ページ(つまり、ランタイムデータ、プログラムスタックなどのファイルシステムソースを持たないデータを含むページ)を交換するのに十分なスワップスペースがない場合、割り当てを拒否します。物理メモリを解放するためのページです。この厳密な計算の利点は、各プロセスが割り当てられた数の仮想メモリへのアクセスを保証することです。ただし、これは、使用可能な仮想メモリの量が本質的にスワップスペースのサイズによって制限されることを意味します。
実際には、プログラムは使用するよりも多くのメモリを割り当てることがよくあります。たとえば、Java Virtual Machine(JVM)は起動時に大量の仮想メモリを割り当てますが、すぐには使用しません。 Linuxカーネルのメモリ統計は、プロセスが実際に使用しているメモリ量を追跡してそれを補償しようとし、仮想メモリ量を過度に使用します。つまり、カーネルが割り当てる仮想メモリの量は、システムの物理メモリとスワップ領域を合わせたものよりも大きくなる可能性があります。これにより、物理メモリとスワップ空間をより活用することができますが、使用されているメモリ量が使用可能な物理メモリとスワップ空間の量を超える場合、カーネルはメモリ割り当ての予約を満たすために何らかの方法でメモリリソースを確保する必要があるという欠点があります。
メモリを回収するカーネルメカニズムは次のとおりです。メモリ不足キラー(OOMキラー)。通常、このメカニズムはメモリを大量に消費する「不良」プロセスを終了し、他のプロセスのためにメモリを解放します。一部の環境では、メモリを解放し、システムをバックアップおよび実行する実行可能なオプションは再起動です。このような場合は、sysctl設定を使用してメモリ不足の状態でパニックが発生するようにカーネルを設定できますvm.panic_on_oom
。
カーネルで使用されるメモリの計算経験的方法は、vm.overcommit_memory
sysctl設定を使用してより自由にまたは厳密にすることができます。厳密なメモリ統計を使用するときにページを保存するのに十分な空き物理メモリまたはスワップ領域がない場合、カーネルは匿名ページを割り当てなくなりました。これは、システムが次のことを行う必要があることを意味します。十分なスワップ領域が設定されました。。