Używam programu Tomcat na maszynie z 64-bitową pamięcią 4-procesorową i 32-bitową (OS to CentOS 6.3). Opcja Java, w której uruchamiam Tomcat, to: -server -Xms1024m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m
Program Java (Tomcat) zatrzymuje pamięć (RES na górze)
Na początku RES ma tylko 810 MB na górze i stale rośnie. W tym okresie uruchamiam jmap -J-d64 -histo pID
, aby sprawdzić stertę pamięci Java i myślę, że gc działa dobrze, ponieważ szczyt sterty wynosi 510 MB, a około 200 MB po gc. Ale gdy OZE w najlepszych wynikach 1.1g, użycie procesora przekroczy 100%, a Tomcat zawiesi się.
Używanie jstack pid
do wyświetlania zrzutu, gdy użycie procesora wynosi 100%, wątek o nazwie "wątek vm" pochłania prawie 100% procesora. Przeszukałem go, to jest wątek JVM. Moje pytanie brzmi: dlaczego res rośnie, kiedy gc działa dobrze? Jak mogę rozwiązać ten problem? Dzięki.
Widzę, że przyjął moją odpowiedź. Tylko z ciekawości, czy mógłbyś krótko opisać, co było przyczyną i co dokładnie pomogło? –
Kiedy wątek gc zajmował więcej niż 100% procesora, pierwszą rzeczą, o której pamiętam, jest przeciek pamięci. Ale faktem jest - Xmx1024m jest zbyt mały dla mojej aplikacji ..... Popełniłem błąd :(Zwiększam pamięć do 2048m (-Xmx2048m), a OZE topu nie wzrasta, gdy jest to 1,2g ......... – ing
to chyba odpowiedź na @digitaljoel jest bardziej odpowiednia do zaakceptowania –