Pamięć procesów Java jest znacznie większa niż określone limity

Zbadałem większość dostępnych metod, aby dowiedzieć się, ile pamięci w rzeczywistości używa proces java. Do tej pory mogę powiedzieć, że wiem, że całkowita przydzielona pamięć może być jedną lub więcej z następujących:

Pamięć sterty (podobno kontrolowana przez moje -XX: MaxHeapSize = 4096m)Permanent Memory (podobno kontrolowane przez moje -XX: MaxPermSize = 1024m)Reserved Code Cache (rzekomo kontrolowane przez moje -XX: ReservedCodeCacheSize = 256m)N wątków * Rozmiar wątku (rzekomo kontrolowany przez moje -XX: ThreadStackSize = 1024)

Ale wyniki są zbyt różne od tego, co mówi mi Linux, przy użyciu dowolnej z metod, które znalazłem, aby uzyskać zużycie pamięci procesu java.

W moim przypadku jest to instancja Tomcat działająca na maszynie Ubuntu 11.10 x86_64, JVM 1.6_u26 64-bit ips -ALcf | grep org.apache.catalina.startup.Bootstrap | wc -l mówi mi, że mam 145 wątków lub procesów uruchomionych, połączonych z tym samym procesem root (Tomcat).

To wszystko powinno dać mi całkowitą maksymalną pamięć (4096 MB) + (1024 MB) + (256 MB) + 145 * (1024 KB) = 5521 MB. Cojmap -heap PID co mi mówiManagementFactory.memoryMXBean.(heapMemoryUsage + nonHeapMemoryUsage).getCommitted() mówi mi, a powyższa wartość teoretyczna jest na parze.

Teraz do strony linux,top inmon oba mówią mi, że ResidentMemory przydzielone przez ten proces to 5,8 GB -> około 5939,2 MB. Ale wiem też, że to tylko część pamięci, część w pamięci RAM na żywo. VIRT przeztop i Rozmiar wgnmon (oba mają reprezentować to samo) mówi mi, że proces wynosi 7530 MB (lub dokładnie 7710952 KB przeznmon). To ZBYT różni się od oczekiwanego maksimum:2009MB powyżej maksimumi zgodnie z jmap i jstat alokacja pamięci sterty nawet nie osiągnęła szczytu (2048-OldSpace + 1534-Eden _ + _ Survivors).

top mówi także, że stos kodu wynosi 36 KB (uczciwy, dla początkowego startera kataliny), a stos danych to 7,3 GB (reprezentujący resztę).

Ta instancja serwera tomcat jest jedyną uruchomioną na tym komputerze i ma pewną niestabilność. Wymaga ponownego uruchomienia co trzy dni, ponieważ urządzenie ma 7647544 KB pamięci RAM i nie ma wymiany (ze względu na wydajność). Zrobiłem matematykę dla limitów i spodziewam się, że proces, który będzie ich śledził, sprawił, że pozostawiłem całkiem niezły margines bezpieczeństwa dla wszystkich innych usług uruchomionych na komputerze (żaden z nich nie powinien przeszkadzać innym niż sam ssh i top): 7468 - 5521 = 1947. To prawie za dużo na „margines bezpieczeństwa”.

Chcę więc zrozumieć, z czego jest wykorzystywana cała pamięć i dlaczego nie jest przestrzegany limit. Jeśli brakuje jakichkolwiek informacji, chętnie udzielę informacji.

questionAnswers(2)

yourAnswerToTheQuestion