
man setrlimit
(私が向かった先は)によるとman ulimit
、
RLIMIT_RSS
プロセスの常駐セット(RAM に常駐する仮想ページの数)の制限(バイト単位)を指定します。この制限は Linux 2.4.x、x < 30 でのみ有効であり、MADV_WILLNEED を指定した madvise(2) の呼び出しにのみ影響します。
つまり、ulimit
(およびsetrlimit
)はプロセスが使用する仮想メモリを制限することしかできないようです。一方、次のような答えはこれです仮想メモリは、特に使用されるよりもはるかに多くの仮想メモリを要求するのが一般的な Java アプリケーションなどでは、ほとんど意味のない統計であると主張します (正しいように思われます)。
そこで私は、システムに課すことができる制限と実際に意味のある数字との間にあるこの断絶の歴史について疑問に思っています。答えられる範囲で、なぜこのような現状になっているのでしょうか?
答え1
RSS は実装の詳細です。プログラムが制御できるリソースは、RLIMIT_AS と RLIMIT_DATA のみです。Unix 実装では、RSS == VMA を常に固定し (要求されたすべてのメモリをコミット)、メモリを無駄に消費する準備ができるほどコンピュータが強力でない場合は、すべての Java 仮想マシンがロード中にクラッシュします。
したがって、参照されたスレッドのコメントは、その人の意見にすぎず、Unix のアーキテクチャとは一致しません。
Linux でこの動作を試すには:
- mem=4G パラメータでカーネルを起動します(または異なる値で試してください)。
- sudo sysctl vm.overcommit_memory=2
- Chromium または 4 GB を超える領域を予約しようとするプログラムを実行する (クラッシュ)