2009-01-16 8 views
5

Słońce JVM wypuszcza DUŻO dodatkowego szumu podczas pracy pod valgrind, co sprawia, że ​​problemy z pamięcią śledzącą w aplikacji są bardzo trudne.Uruchamianie aplikacji JNI w Sun VM pod Valgrind

Chciałbym znaleźć plik tłumienia lub tryb uruchamiania maszyny wirtualnej, który usunie fałszywe błędy pamięci w celu oddzielenia ziarna od plew w tej sytuacji. Jakieś sugestie?

+0

Znalazłem śledzenie problemów pamięci JNI na Win32 nie jest łatwiejsze. –

+0

Jeśli utworzysz plik wykluczeń, czy mógłbyś go opublikować tutaj? – Arkadiy

Odpowiedz

1

Co z profilowaniem tego natywnego kodu poza aplikacją Java? Zwykle kod JNI jest opakowaniem niektórych bibliotek, które nie są specyficzne dla języka Java. Nie jestem pewien, czy jest to prawdą w twoim przypadku, ale jeśli jest to możliwe, problemy z pamięcią mogą być izolowane przez napisanie prostego szkieletu testowego C lub C++ wokół tej biblioteki?

Jeśli twoja architektura jest w C++, to możesz również samemu dostarczyć nowe i usunąć operatorów i śledzić zużycie pamięci. Będziesz musiał zebrać statystyki i przetworzyć je za pomocą niektórych skryptów, ale może to działać dobrze.

1

Nie mogę odpowiedzieć na twoje zaksięgowane pytanie, ale czy możesz wyjaśnić, jaki masz problem?

Innymi słowy, można powiedzieć, czy jest ...

  • w warstwie JNI a nie problem JVM zakres obiekt?
  • Korzystanie z free'd pamięci?
  • Buforowanie/nadpisanie bufora?
  • Inne uszkodzenie pamięci?

Niedawno musiałem debugować Javę/C, która miała problemy (po 30 minutach od uruchomienia), co okazało się używanie pamięci po tym, jak została zwolniona. Próbowałem używać dmalloc, mojej własnej biblioteki wycieku pamięci, Valgrind i żaden nie działał tak, jak potrzebowałem.

Ostatecznie stworzyłem prosty zestaw obwolut dookoła wolnego, malloc, calloc, realloc, który po prostu wydrukował adresy i rozmiary pamięci do pliku. Po jego przerwaniu (w ramach GDB) mogłem cofnąć się w czasie i dowiedzieć się, kiedy pamięć została zwolniona i gdzie odniesienia nie zostały usunięte.

JEŻELI twój problem jest w C/C++ i możesz uwięzić błąd w debugerze, to może ci pomóc. Tak, to żmudne, ale może nie gorsze niż przeglądanie megabajtów produkcji Valgrinda.

Nadzieję, że pomaga & powodzenia.

+0

Staram się identyfikować wycieki proaktywnie, nie wytropić jednego, który wiem, że istnieje. Wolałbym unikać twojej sytuacji, właściwie :) To rodzaj nawyku, że uruchamiam moje aplikacje przez valgrind przed ich wypuszczeniem. Jednak biblioteka JNI robi coś w tym stylu. –

0

Chociaż nie tak oszałamiający jak valgrind (w oparciu o to, co przeczytałem), możesz spróbować jmap i jhat. Narzędzia te umożliwiają wykonanie migawki uruchomionego procesu i sprawdzenie, co się dzieje. Użyłem tej techniki do prostych wycieków pamięci i działa dobrze. Jeśli jednak problemy z pamięcią są spowodowane przydziałami innymi niż jvm, nie pomoże to.