Любой подход должен дать вам примерно одинаковое число. Всегда полезно выделять кучу -X..m
-X..x
для всех поколений. Затем вы можете гарантировать, а также сделать ps, чтобы увидеть, какие параметры были переданы и, следовательно, используются.
Для фактического использования памяти вы также можете приблизительно сравнить VIRT (выделенный и совместно используемый) и RES (фактически используемый), а также значения jstat:
Для Java 8 см. Jstat для этих значений на самом деле. Предполагая, что вы запускаете простой класс без mmap или обработки файлов.
$ jstat -gccapacity 32277
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
215040.0 3433472.0 73728.0 512.0 512.0 67072.0 430080.0 6867968.0 392704.0 392704.0 0.0 1083392.0 39680.0 0.0 1048576.0 4864.0 7225 2
$ jstat -gcutil 32277
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
6.25 0.00 7.96 18.21 98.01 95.29 7228 30.859 2 0.173 31.032
Макс :
NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX
3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
(примерно близко и ниже к VIRT памяти)
Макс (Мин, Используется):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(примерно близко к памяти RES)
«Не цитируйте меня по этому поводу», но VIRT mem примерно равна или превышает максимально выделенную память, но пока используемая память свободна / доступна в физической памяти, JVM не выдает исключение памяти. Фактически, максимальный объем памяти даже не проверяется на предмет физической памяти при запуске JVM, даже если в ОС он выключен. Лучшее объяснение того, что Виртуальная память действительно использовала процесс Java, обсуждается здесь .
jstat
следует использовать, чтобы проверить только общее использование памяти JVM? Допустим, вы запускаете JVMXms=4g
иXmx=4g
хотите посмотреть, сколько памяти уже используется?