Toute approche devrait vous donner à peu près le même nombre. C'est toujours une bonne idée d'allouer le tas en utilisant -X..m
-X..x
pour toutes les générations. Vous pouvez alors garantir et également faire ps pour voir quels paramètres ont été passés et donc utilisés.
Pour les utilisations réelles de la mémoire, vous pouvez comparer approximativement VIRT (alloué et partagé) et RES (réellement utilisé) aux valeurs jstat:
Pour Java 8, voir jstat pour ces valeurs signifient réellement. En supposant que vous exécutiez une classe simple sans mmap ni traitement de fichier.
$ 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
(à peu près proche et inférieur à la mémoire VIRT)
Max (Min, utilisé):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(à peu près proche de la mémoire RES)
"Ne me citez pas là-dessus" mais VIRT mem est à peu près proche ou supérieur à la mémoire maximale allouée, mais tant que la mémoire utilisée est libre / disponible dans la mémoire physique, JVM ne lance pas d'exception de mémoire. En fait, la mémoire maximale n'est même pas vérifiée par rapport à la mémoire physique au démarrage de la JVM, même avec la permutation sur le système d'exploitation. Une meilleure explication de la mémoire virtuelle réellement utilisée par un processus Java est présentée ici .
jstat
parmi les options à utiliser pour vérifier uniquement l'utilisation globale de la mémoire d'une JVM? Disons que vous démarrez la JVM avecXms=4g
etXmx=4g
et que vous voulez voir, quelle quantité de mémoire est déjà utilisée?