Qualsiasi approccio dovrebbe darti approssimativamente lo stesso numero. È sempre una buona idea assegnare l'heap utilizzando -X..m
-X..x
per tutte le generazioni. Puoi quindi garantire e fare anche ps per vedere quali parametri sono stati passati e quindi utilizzati.
Per gli utilizzi effettivi della memoria, è possibile confrontare approssimativamente il confronto VIRT (allocato e condiviso) e RES (effettivamente utilizzato) con i valori jstat:
Per Java 8, vedere jstat per questi valori in realtà significano. Supponendo di eseguire una classe semplice senza mmap o elaborazione di file.
$ 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
(approssimativamente vicino e sotto alla memoria VIRT)
Max (Min, usato):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(approssimativamente vicino alla memoria RES)
"Non citarmi su questo" ma VIRT mem è approssimativamente vicino o superiore alla memoria Max allocata ma fintanto che la memoria utilizzata è libera / disponibile nella memoria fisica, JVM non genera eccezioni di memoria. In effetti, la memoria massima non viene nemmeno verificata rispetto alla memoria fisica all'avvio di JVM anche con swap disattivato sul sistema operativo. Una spiegazione migliore di quale memoria virtuale è realmente utilizzata da un processo Java è discussa qui .
jstat
si dovrebbero usare per verificare solo l'utilizzo della memoria complessiva di una JVM? Supponiamo che avvii la JVM conXms=4g
eXmx=4g
desideri vedere quanta memoria sia già utilizzata?