Qualquer abordagem deve fornecer aproximadamente o mesmo número. É sempre uma boa idéia alocar o heap usando -X..m
-X..x
para todas as gerações. Você pode garantir e também fazer ps para ver quais parâmetros foram passados e, portanto, estão sendo usados.
Para usos reais de memória, é possível comparar aproximadamente VIRT (alocado e compartilhado) e RES (real usado) com os valores jstat:
Para Java 8, consulte jstat para esses valores realmente significam. Supondo que você execute uma classe simples sem mmap ou processamento de arquivo.
$ 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
Máx :
NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX
3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
(aproximadamente perto e abaixo da memória VIRT)
Máx. (Mín., Usado):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(aproximadamente perto da memória RES)
"Não me cite sobre isso", mas o mem VIRT está aproximadamente próximo ou superior à memória máxima alocada, mas enquanto a memória utilizada estiver disponível / disponível na memória física, a JVM não emitirá exceção de memória. De fato, a memória máxima nem é verificada em relação à memória física na inicialização da JVM, mesmo com a troca desativada no SO. Uma explicação melhor sobre o que a memória virtual realmente usou por um processo Java é discutida aqui .
jstat
devem ser usadas para verificar apenas o uso geral de memória de uma JVM? Digamos que você inicie a JVMXms=4g
eXmx=4g
deseje ver quanta memória já está sendo usada?