У меня есть машина с 16G RAM. Я запускаю Java-приложение с аргументами -Xms9G -Xmx9G
.
Когда я запускаю команду top
, я вижу, что мой процесс Java принимает 13,8 г VIRT , но только 4,6 г RES .
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5019 root 20 0 13.8g 4.7g 18m S 0.7 30.7 3:28.39 java
При выполнении команды pmap
я вижу, что только ~ 3.9g кучи присутствует как RES , остальные 5.7g находятся в виртуальном .
Address Kbytes RSS Dirty Mode Mapping
0000000580000000 9452384 4074228 4074228 rw--- [ anon ]
Наблюдая за HPCUR с помощью jvmtop
, я замечаю, что GC срабатывает, когда HPCUR достигает примерно 3g .
PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL
5019 .1-SNAPSHOT.jar 408m 9216m 192m n/a 0.25% 0.00% O8U20 webapp 823
Я заметил, что RES для процесса постепенно увеличивается , куча памяти в RES (по pmap) также постепенно увеличивается. В результате порог ГХ увеличивается.
У меня есть несколько вопросов об этом поведении.
- Используется только куча, которая присутствует в RES, а не VIRT?
- Если я выделил кучу мин 9G (
-Xms
), то изначально, почему выделено только 3,9 г RES. Разве это не то же самое, что поддерживать -Xms низким? Какой смысл хранить -Xms = -Xmx тогда?
- На каком основании принято решение, сколько кучи должно быть в RES? Где-то читал, что это управляется ОС, но какая-то грубая логика?
- Есть ли способ убедиться, что выделенная куча действительно используется?