Java memory leak, furcsaságok

Fórumok

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?

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?

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 ...

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]

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.