Każde podejście powinno dać mniej więcej taką samą liczbę. Zawsze dobrze jest przydzielić stertę -X..m
-X..x
dla wszystkich pokoleń. Możesz wtedy zagwarantować, a także zrobić ps, aby zobaczyć, jakie parametry zostały przekazane, a zatem są używane.
W przypadku rzeczywistego wykorzystania pamięci można z grubsza porównać VIRT (przydzielone i współdzielone) i RES (faktycznie używane) w porównaniu z wartościami jstat:
W przypadku języka Java 8 zobacz jstat, gdzie te wartości faktycznie oznaczają. Zakładając, że uruchamiasz prostą klasę bez mmap lub przetwarzania plików.
$ 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
Maks . :
NGCMX + S0C + S1C + EC + OGCMX + MCMX + CCSMX
3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB
(mniej więcej blisko i poniżej pamięci VIRT)
Max (min, używane):
215040 + 512 + 512 + 67072 + 430080 + 39680 + 4864 = ~ 1GB
(z grubsza zbliżone do pamięci RES)
„Nie cytuj mnie w tej sprawie”, ale VIRT mem jest mniej więcej blisko lub więcej niż przydzielona maksymalna ilość pamięci, ale dopóki używana pamięć jest wolna / dostępna w pamięci fizycznej, JVM nie zgłasza wyjątku pamięci. W rzeczywistości maksymalna pamięć nie jest nawet porównywana z pamięcią fizyczną podczas uruchamiania maszyny JVM, nawet przy wyłączonej wymianie w systemie operacyjnym. Lepsze wyjaśnienie tego, jaka pamięć wirtualna naprawdę jest używana przez proces Java, jest omówione tutaj .
jstat
należy użyć, aby zweryfikować tylko ogólne użycie pamięci maszyny JVM? Powiedzmy, że uruchamiasz maszynę JVM odXms=4g
iXmx=4g
i chcesz sprawdzić, ile pamięci jest już używane?