Cualquier enfoque debería darte aproximadamente el mismo número. Siempre es una buena idea asignar el montón utilizando -X..m
-X..x
todas las generaciones. Luego puede garantizar y también hacer ps para ver qué parámetros se pasaron y, por lo tanto, se están utilizando.
Para los usos de memoria reales, también puede comparar aproximadamente VIRT (asignado y compartido) y RES (real utilizado) en comparación con los valores jstat:
Para Java 8, vea jstat para estos valores realmente significan. Suponiendo que ejecuta una clase simple sin mmap o procesamiento de archivos.
$ 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
Max :
NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX
3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
(aproximadamente cerca y debajo de la memoria VIRT)
Max (Min, Usado):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(aproximadamente cerca de la memoria RES)
"No me cite sobre esto", pero la memoria VIRT está más o menos cerca de la memoria máxima asignada, pero siempre que la memoria utilizada esté libre / disponible en la memoria física, JVM no arroja una excepción de memoria. De hecho, la memoria máxima ni siquiera se compara con la memoria física en el inicio de JVM, incluso con el intercambio apagado en el sistema operativo. Aquí se discute una mejor explicación de qué memoria virtual realmente utiliza un proceso Java .
jstat
se deben usar para verificar solo el uso general de la memoria de una JVM? Supongamos que comienza la JVM conXms=4g
yXmx=4g
y desea ver, ¿cuánta memoria de eso ya se utiliza?