Будь-який підхід повинен дати вам приблизно однакову кількість. Завжди корисно виділити купу, використовуючи -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
(приблизно в пам’яті з ВДЕ)
"Не цитуйте мене з цього приводу", але пам'ять VIRT приблизно близька або більше, ніж виділена максимальна пам'ять, але поки пам'ять, що використовується, є вільною / доступною у фізичній пам'яті, JVM не викидає пам'ять виключення. Насправді, максимальна пам'ять навіть не перевіряється фізичною пам'яттю при запуску JVM навіть при відключенні в ОС. Найкраще пояснення того , що Віртуальна пам'ять дійсно використовується процесом Java обговорюється тут .
jstat
слід використовувати, щоб перевірити лише загальне використання пам'яті JVM? Скажімо, ви починаєте JVM зXms=4g
іXmx=4g
хочете побачити, скільки пам'яті на це вже використовується?