We hebben een proces draaien dat op gezette tijden berekeningen voor ons doet. Die berekeningen worden daarna opgeslagen in een database.
Nu is het probleem dat het proces dat die berekeningen uitvoert geheugen lekt. Alleen kunnen we niet vinden waar dat gebeurt. Met de gebruikelijke HEAP dumpes etc lijkt het geheugen gebruik binnen de perken te b;ijven. Na 7 nachten van berekenen is de heap niet groter dan ~1GB. Dit terwijl we op OS (linux x64) niveau van 1,7GB used memory naar 5.9GB used memory zijn gegaan.
Na nog een nacht berekenen zien we dan dat Linux de OOM aanroept en het Java proces afschiet.
In de onderstaande tabel zie je van een aantal dagen achter elkaar de gemeten waarden van:
pmap -x <pid> --> RSS in kB
Heap usage
Heap allocation
Deze waarden zijn van hetzelfde java proces dat een x aantal dagen achter elkaar draait. Elke ochtend zijn deze waarden gemeten
Hoe kan ik achterhalen waar het geheugen naar toe gaat?
Visualvm (waar ik de HEAP mee uitlees) gegeven niet echt veel meer informatie.
Ik heb ook gekeken naar open connecties/thread leaks omdat voor elke thread er een aparte stack wordt opgebouwd waar buiten om de HEAP ook geheugen voor wordt gealloceerd, maar het aantal threads groeit niet
Nu is het probleem dat het proces dat die berekeningen uitvoert geheugen lekt. Alleen kunnen we niet vinden waar dat gebeurt. Met de gebruikelijke HEAP dumpes etc lijkt het geheugen gebruik binnen de perken te b;ijven. Na 7 nachten van berekenen is de heap niet groter dan ~1GB. Dit terwijl we op OS (linux x64) niveau van 1,7GB used memory naar 5.9GB used memory zijn gegaan.
Na nog een nacht berekenen zien we dan dat Linux de OOM aanroept en het Java proces afschiet.
In de onderstaande tabel zie je van een aantal dagen achter elkaar de gemeten waarden van:
pmap -x <pid> --> RSS in kB
Heap usage
Heap allocation
pmap | heap usage | heap allocated |
---|---|---|
1711324kB (1670MB) | 889810kB (868MB) | 1000079kB (976MB) |
2203704kB (2152MB) | 861306kB (841MB) | 1075970kB (1050MB) |
3901152kB (3809MB) | 828637kB (809MB) | 958005kB (935MB) |
4238564kB (4139MB) | 1116391kB (1090MB) | 1254883kB (1225MB) |
5834520kB (5697MB) | 1012103kB (988MB) | 1244079kB (1214MB) |
Deze waarden zijn van hetzelfde java proces dat een x aantal dagen achter elkaar draait. Elke ochtend zijn deze waarden gemeten
Hoe kan ik achterhalen waar het geheugen naar toe gaat?
Visualvm (waar ik de HEAP mee uitlees) gegeven niet echt veel meer informatie.
Ik heb ook gekeken naar open connecties/thread leaks omdat voor elke thread er een aparte stack wordt opgebouwd waar buiten om de HEAP ook geheugen voor wordt gealloceerd, maar het aantal threads groeit niet
[ Voor 12% gewijzigd door Thyzz op 23-02-2012 14:44 . Reden: ook mb's toegevoegd ]