Adott egy oldal (apache + tomcat). Az alábbi jelenséget produkálja.
Kis magyarázat a grafikonhoz:
OU: jvm Garbage-collector Old space utilization
OC: jvm Garbage-collector Old space capacity
Azaz: Pár napnyi működés után elkezd felkúszni az old space capacity értéke, miközben a utilization értéke nem emelkedik. Nincs OutOfMemory exception. Cserébe az oldal elkezd iszonyat
módon lassulni ...
Bárkinek tippje, hogy mi okozhatja? Vagy hogy milyen módszerek vannak a probléma kiderítésére?
- 1710 megtekintés
Hozzászólások
Probáld ki a jmap, jhat, jvisualvm (java bin könyvtárában, utóbbi kettő csak 1.6-tól) programokat.
A grafikon végén a letörés az restart?
- A hozzászóláshoz be kell jelentkezni
Ezeket ismerem! Sajnos nem dumpoltam ki a heapet ma a restart előtt. A következőnél azzal fogom kezdeni ...
Igen, a letörés a restart!
- A hozzászóláshoz be kell jelentkezni
Találtam egy jó kis programot: Eclipse Memory Analyzer. Mindenkinek javasom aki java memory leakekkel szívatja magát.
Sajnos rajtam nem segített. Illetve annyi kiderült, hogy az alkalmazás normális méretű memóriát zabál (~100Mb), ellenben a JVM szépen lassan az egész capacity-t lefoglalja az OS-től. Viszont a lassulást amit írtam más okozta, így végülis nem tragédia ez a viselkedés, csak kicsit furcsa ...
- A hozzászóláshoz be kell jelentkezni
Viszont a lassulást amit írtam más okozta
mi okozta?
- A hozzászóláshoz be kell jelentkezni
Az oldal aznap kb 5x akkora terhelést kapott, mint szokott, és ez előhozott egy szinkronizációs hibát a cache rétegben.
- A hozzászóláshoz be kell jelentkezni
Tomcat6.0.26-ot is kipróbálhatod. Bekapcsolod a memória elfogyás elleni védelmet, ez logolgat, ha valami nem tetszik neki:
http://www.javaforum.hu/javaforum/0/action/news/news/70/action/news.Det…
- A hozzászóláshoz be kell jelentkezni
köszi, ezt majd megnézem ...
- A hozzászóláshoz be kell jelentkezni
Kicsit kiegészíteném az eredeti kérdést:
Egy normális JVM GC grafikon ugy néz ki, hogy az occupation meg a capacity valamilyen szinten együtt mozog. Azaz amikor az occupation sokáig a capacity alatt marad, akkor leveszi szépen a capacityt. Itt egy példa.
Az érdekelne, hogy milyen oka lehet annak amikor ezek "elválnak"!
Itt egy "pontosabb" statisztika (2 másodpercenként mérve ...) [zöld: capacity, piros: occupation]
- A hozzászóláshoz be kell jelentkezni
Milyen GC-t használsz? Próbáltad a GC-ket és a paramétereket tuningolni? Attól lehet ilyen, ha mondjuk beállítod, hogy hetente egyszer fusson a GC :).
Nálunk volt egyszer volt egy alattomos memory leak, aztán 2-3 nap szívás után kiderült, hogy nem a saját kódban volt a hiba (amire az ember egyből gondol), hanem az egyik AJAX library cache nőtt oldalanként irreálisan nagyra. Egy memory leak nagy szopás tud lenni, de legalább nagyon jó eszközök vannak az okok kiderítésére.
- A hozzászóláshoz be kell jelentkezni
Alap paraméterekkel megy a GC. Nekünk is volt/van egy memory leakünk a JDBC4-es DB2 driverrel, de ott nem csak a capacity növekszik, hanem a utilization is maximumra.
- A hozzászóláshoz be kell jelentkezni