Spring + tomcat + vps server(debian x64) - brak pamięci RAM

0

Cześć!

Mam problem z moim vps. Hostuję sobie apke napisaną w Springu na Vps wykupionym u providera. Vps posiada 1GB pamięci Ram. I właśnie zaczyna mi jej brakować.
Java wykorzystuje ok. 80% pamięci serwera. Aplikacja jest banalnie prosta. Zwykły CRUD w oparciu o Hibernate na MySQL. W czym może być problem? Nie znam się za bardzo na serwerach wiec nie wiem jakie logi tutaj wkleić. Apke hostuje na tomcatcie.

java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)


Distributor ID:	Debian
Description:	Debian GNU/Linux 7.8 (wheezy)

Using CATALINA_BASE:   /usr/share/tomcat
Using CATALINA_HOME:   /usr/share/tomcat
Using CATALINA_TMPDIR: /usr/share/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/java-8-oracle
Using CLASSPATH:       /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.29
Server built:   Nov 20 2015 09:18:00 UTC
Server number:  8.0.29.0
OS Name:        Linux
OS Version:     3.2.0-4-amd64
Architecture:   amd64
JVM Version:    1.8.0_66-b17
JVM Vendor:     Oracle Corporation


 
0

Zacząłbym jednak szukać problemu od tej twojej aplikacji, bo to pewnie z niej gdzieś cieknie. Ona nagle zabiera tyle pamięci czy z czasem zjada więcej?
Poza tym java defaultowo pewnie ma ustawione 1g pamięci w stercie i może tak być że serwer olewa GC póki ma pamięć. Możesz w parametrach tomcata ustawić mniej pamięci i zobaczyć jak zareaguje.

0

Od razu zabiera tyle pamięci. Sprawdzam zarządzanie pamięcią przez tomcata i jave. @Shalom masz może jakieś tutoriale jak się do tego zabrać? Mam pare wyników z googla ale na razie brak efektów.

0

Ale jakie tutoriale? Wchodzisz w jakieś catalina.conf czy w skrypt którym startujesz tomcata i patrzysz z jakimi parametrami javy startuje. Ustawiasz jakieś -Xmx510m i będzie zjadało mniej.

1

Samo to, że zabiera samo z siebie 80% ramu jeszcze nie znaczy, że tego ramu brakuje bo jvm sobie bierze trochę na zapas.

Z racji podziału pamięci na tą na stosie i tą poza stosem często zdarza się, że XmX stanowi ok połowę tego co tak na prawdę aplikacja zrzera.
Poza tym parametrem możesz dodać polecenie użycia GC G2 i polecenie robiące dump pamięci przy wywaleniu(tzn gdy tej pamięci faktycznie zabraknie):
http://blog.denevell.org/tomcat7-heap-dump-out-of-memory.html
Polecam też włączyć Jit(dla serwera to będzie flaga C2), bo on w runtime wyszukuje sobie deadcode i go eliminuje, oraz potrafi przepisać funkcję do kodu maszynowego jeżeli jest często używana.

Co do samej aplikacji to pierwsze co możesz zrobić to odpalić statyczną analizę kodu i już ona może pokazać problemy z wydajnością(np sklejanie stringów w pętli zamiast stringbuildera/stringbuffera).

Jeżeli aplikacja jest tak jak piszesz crudem to sama zmiana kolekcji ze standardowych javowych/guavy na kolekcje z biblioteki Trove powinna znacznie poprawić wydajność od strony pamięci.

Jak już te proste kroki zrobisz i dalej będziesz miał problemy to zostaje już użycie profilera i sprawdzenie co konkretnie powoduje problem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1