Любой подход должен дать вам примерно такое же число. Всегда рекомендуется выделять кучу с использованием -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 примерно равна или превышает максимальный размер выделенной памяти, но пока используемая память свободна / доступна в физической памяти, JVM не генерирует исключение памяти. . Фактически, максимальный объем памяти даже не сравнивается с физической памятью при запуске JVM, даже если свопинг отключен в ОС. Лучшее объяснение того, какая виртуальная память действительно используется процессом Java, обсуждается здесь.
person
kisna
schedule
06.03.2018