新しい VM の top は、私のプロセスの 1 つが 100 GB の仮想メモリを消費していることを示しています。私はそれを読んだ。おそらく過度の使用のためしかし、少し多すぎます。特に、物理メモリが6 GB、スワップスペースが2 GB、単一の40 GBハードドライブパーティションしかない仮想マシンでは、このようなことを見たことはありません。
101GB VIRTを使用する興味深いプロセスはEclipse IDE(数分前に開始)で、もう1つは98GB VIRTを使用するWebKitWebProcessです。他のすべてのプロセスのVIRT値は約1〜2 GBです。 3つのツールすべてがこれに同意するようです:top
、、htop
およびps
。
- プロセスがあまりにも多くの仮想メモリを要求する妥当な理由はありますか?
- そのような行動はシステムに有害ではありませんか?
- 現在の総仮想メモリ量の制限はいくらですか?
修正する
詳細:
Linux 4.15.0-38-generic x86_64 GNU/Linux, Linux Mint 19 Tara
Java HotSpot(TM) 64 ビットサーバー VM (ビルド 25.191-b12, 混合モード)
バージョン: 2018-09(4.9.0) 内部バージョンID:20180917-1800
/proc//maps の内容は次に終了します。
00400000-00401000 r-xp 00000000 08:01 132092 /usr/lib/jvm/java-8-oracle/jre/bin/java
00600000-00601000 r--p 00000000 08:01 132092 /usr/lib/jvm/java-8-oracle/jre/bin/java
00601000-00602000 rw-p 00001000 08:01 132092 /usr/lib/jvm/java-8-oracle/jre/bin/java
014fc000-02ebe000 rw-p 00000000 00:00 0 [heap]
c0000000-d0000000 rw-p 00000000 00:00 0
d0000000-100000000 ---p 00000000 00:00 0
100000000-1012c6000 rw-p 00000000 00:00 0
1012c6000-140000000 ---p 00000000 00:00 0
7ef800000000-7ef800004000 rw-p 00000000 00:00 0
7ef800004000-7ef8000ec000 rw-p 00000000 00:00 0
7ef8000ec000-7ef800100000 rw-p 00000000 00:00 0
7ef800100000-7f0800000000 rw-p 00000000 00:00 0
7f0800000000-7f1000000000 ---p 00000000 00:00 0
表示された最後の2行が犯人のようです0x7f0800000000 - 0x7ef800100000 ≈ 68.7e9
。私が知っている限り、これは権限のないマップされていないプライベートゾーンです。それが私が言うことができるすべてです...
答え1
索引付け可能なすべてのファイルをマップする可能性が高いです。何千ものファイルを含む同様のKafkaマッピングを見たことがありますが、通常は仮想スペースがはるかに高くなります(〜10倍)。以下を実行できます。
cat /proc/{PID}/maps
(ここで{PID}はEclipseプロセスIDです。)この場合であることを確認してください。その場合、仮想スペースが大きすぎる場合は、印象が必要になることがありますvm.max_map_count
。sysctl
答え2
ファイルがマップされるたびに、オペレーティングシステムは連続した仮想ページセットを割り当てます。
私はJavaを知りませんが、それぞれの新しいファイルを少なくとも1 Mbの境界(ほとんどは確かに2 Mb)にソートされた新しいアドレスにマッピングする可能性があります。
したがって、非常に小さなファイル(64Kbなど)がメモリにマップされると、隣接する仮想ページで2Mbのメモリが使用されます。十分に小さいファイルでこれを行うと、基本入力よりはるかに速く成長するため、ディスクやRAMよりも潜在的に大きくなる可能性があります。
また、一部のデバッグモードで実行すると、ほとんどのメモリ割り当てがはるかに大きくなります。あなたの場合はそうではないかもしれません。 C / C ++の場合、Googleがこれを行う sanitizer というシステムを開発しました。これにより、メモリオーバーフロー(ブロック開始前後の書き込みなど)を検出でき、これを達成するためにMMUを使用します(たとえば、誤った場所のメモリに書き込むとハードウェア割り込みが発生し、読み込みがあまり良くありません)。優れた保護)、Intelプロセッサのバッファには4K制限が必要です。これらのプロセスは通常、起動時に20 Tbなどの大量のメモリを使用します。