Pracuję, top
aby monitorować wydajność serwera, a 2 moje procesy Java pokazują pamięć wirtualną do 800 MB-1 GB. Czy to źle?
Co oznacza pamięć wirtualna?
Aha btw, mam zamianę 1 GB i pokazuje 0% zużytego. Więc jestem zmieszany.
Proces Java = 1 serwer Tomcat + mój własny demon java Server = Ubuntu 9.10 (karmic)
linux
virtualization
memory
top
kapso
źródło
źródło
Odpowiedzi:
Pamięć wirtualna niekoniecznie jest pamięcią. Na przykład, jeśli pamięć procesu mapuje duży plik, plik jest faktycznie przechowywany na dysku, ale w dalszym ciągu zajmuje „przestrzeń adresową”.
Przestrzeń adresowa (tj. Pamięć wirtualna na liście procesów) nic nie kosztuje; to nie jest prawdziwe. Rzeczywista jest kolumna RSS (RES), która jest pamięcią rezydentną. Tak wiele pamięci zajmuje proces.
Ale nawet to nie jest cała odpowiedź. Jeśli proces wywołuje fork (), dzieli się na dwie części i obie początkowo udostępniają wszystkie swoje kanały RSS. Więc nawet jeśli RSS miałby początkowo 1 GB, wynikiem po rozwidleniu byłyby dwa procesy, każdy z RSS o wielkości 1 GB, ale nadal używałbyś tylko 1 GB pamięci.
Zdezorientowany? Oto, co naprawdę musisz wiedzieć: użyj
free
polecenia i sprawdź wyniki przed i po uruchomieniu programu (w+/- buffers/cache
wierszu). Różnica polega na tym, ile nowej pamięci używał nowo uruchomiony program.źródło
smem
.java -Xmx16g RunLong
, który zarezerwowałby pamięć 16 Gb dla procesu Java, to naVIRT
górze wydaje się, że 16 Gb jest liczony. W takim przypadku, jaki jest typ tej pamięci 16 Gb, czy jest to pamięć zmapowana lub ...?Z górnej strony podręcznika (1):
Gdzie RES oznacza pamięć RESident (używana pamięć fizyczna).
Właściwie to już nie jest poprawne. Kiedy mówi „zamień”, obejmuje to również pliki, które program zamapował na swoją przestrzeń adresową, która może, ale nie musi, faktycznie zużywać prawdziwą pamięć RAM. Ta pamięć ma kopię zapasową pliku, ale tak naprawdę nie jest wymienna.
VIRT obejmuje także strony, które zostały przydzielone, ale do niczego jeszcze nie wykorzystane. Każda strona w tym stanie jest odwzorowana na jądro strony zerowej (genialna koncepcja - powinieneś to sprawdzić), więc wyświetla się w VIRT, ale tak naprawdę nie zużywa żadnej pamięci.
źródło
-m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT
. Szkoda, że nie mogę głosować za tą odpowiedzią.To wyjaśnienie Mugurel Sumanariu było dla mnie bardzo jasne:
źródło
Kolumna VIRT w wyjściu ps / top jest prawie nieistotna do pomiaru zużycia pamięci. Nie martw się o to. Pamięć VIRT o dużym obciążeniu Apache a pamięć RES
https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used
źródło
Linux obsługuje pamięć wirtualną, to znaczy użycie dysku jako rozszerzenia pamięci RAM, aby odpowiednio zwiększyć efektywny rozmiar pamięci użytecznej. Jądro zapisze zawartość aktualnie nieużywanego bloku pamięci na dysku twardym, aby pamięć mogła zostać wykorzystana do innego celu. Gdy oryginalna zawartość jest ponownie potrzebna, są one ponownie wczytywane do pamięci. Wszystko to jest całkowicie przejrzyste dla użytkownika; programy działające w systemie Linux widzą tylko większą ilość dostępnej pamięci i nie zauważają, że niektóre z nich znajdują się na dysku od czasu do czasu. Oczywiście, czytanie i zapisywanie na dysku twardym jest wolniejsze (rzędu tysiąc razy wolniej) niż używanie prawdziwej pamięci, więc programy nie działają tak szybko. Część dysku twardego używana jako pamięć wirtualna nazywana jest przestrzenią wymiany.
Linux może używać normalnego pliku w systemie plików lub oddzielnej partycji dla przestrzeni wymiany. Partycja wymiany jest szybsza, ale łatwiej jest zmienić rozmiar pliku wymiany (nie trzeba partycjonować całego dysku twardego i ewentualnie instalować wszystkiego od zera). Kiedy wiesz, ile potrzebujesz przestrzeni wymiany, powinieneś wybrać partycję wymiany, ale jeśli nie masz pewności, możesz najpierw użyć pliku wymiany, użyj systemu na chwilę, abyś mógł sprawdzić, ile wymiany masz potrzebujesz, a następnie utwórz partycję wymiany, gdy masz pewność co do jego rozmiaru.
Powinieneś także wiedzieć, że Linux pozwala na korzystanie z kilku partycji wymiany i / lub plików wymiany w tym samym czasie. Oznacza to, że jeśli tylko od czasu do czasu potrzebujesz nietypowej ilości przestrzeni wymiany, możesz w tym czasie ustawić dodatkowy plik wymiany, zamiast cały czas przydzielać całą kwotę.
Uwaga na temat terminologii systemu operacyjnego: informatyka zwykle rozróżnia między zamianą (zapisywanie całego procesu na przestrzeń wymiany) a stronicowaniem (pisanie tylko części o stałym rozmiarze, zwykle kilku kilobajtów jednocześnie). Przywoływanie jest zwykle bardziej wydajne i tak robi Linux, ale tradycyjna terminologia Linuksa mówi o zamianie.
Źródło: http://www.faqs.org/docs/linux_admin/x1752.html
źródło
VIRtual
kolumna na górze odnosi się do superprzestrzeni (miejsca do zużycia) procesu, którego proces może nie brać w rzeczywistości w czasie wykonywania. Istnieje inna kolumnaRESident
, która odnosi się do faktycznej pamięci fizycznej / przestrzeni przydzielonej przez proces w czasie wykonywania.Przyczynę różnicy między nimi można zrozumieć na przykładzie: jeśli proces korzysta z określonej biblioteki, wówczas rozmiar biblioteki również pomoże
virtual-size
. jednak ponieważ tylko część biblioteki byłaby używana (tj. niektóre metody w użyciu), więc to pomożeresident-size
.Zobacz więcej informacji
źródło
„VIRT” to po prostu przestrzeń adresowa, RES jest „rzeczywistą” pamięcią, ale „SHR” (= współużytkowana) ilość „RES” jest częścią RES, która jest współdzielona z innymi procesami. Tak więc w przypadku większości procesów uważam, że odjęcie SHR od RES daje ci ilość pamięci, którą naprawdę można przypisać do tego konkretnego procesu.
źródło