2011-06-22 25 views
6

lsof to ładne narzędzie dla systemu Unix, pokazujące wszystkie aktualnie otwarte uchwyty plików.lsof odpowiednik JVM?

Czy ktoś zna podobne narzędzie, które wyświetliłoby wszystkie otwarte pliki wewnątrz uruchomionej maszyny JVM (za pośrednictwem JVMTI lub podobnego interfejsu)?

W tym konkretnym przypadku wystarczyłoby mi wiedzieć, która klasa ma otwarty uchwyt. Metoda/line lub nawet cały łańcuch do GC root byłby fantastyczny, ale klasa właściciela obsługi jest już dobrym początkiem.

Wiem, że mógłbym zrobić zrzut sterty, otworzyć go w profilerze i znaleźć to, ale jest to żmudne zadanie, szczególnie w przypadku dużych hałd.

+0

Proponuję użyć lepszego profilera. ;) W YourKit mogę zobaczyć wszystkie otwarte pliki podczas działania aplikacji. –

+0

Używam YourKit, ale rzadko masz włączone profilowanie na żywo. Czy też obsługa YourKit obsługuje wyświetlanie uchwytów plików ze zrzutów? – mindas

+1

Obsługuje wyświetlanie FileDescriptor ze zrzutu, wyszukując według klasy, która jest używana dla wszystkich otwartych plików. Możesz zobaczyć, gdzie są przechowywane odniesienia do dowolnego pliku. –

Odpowiedz

1

Opcja JVMTI brzmi, jakby to nie był zły wybór. Wielkim problemem byłoby zapewnienie, że otoczysz wszystko, co może otworzyć uchwyt pliku: będziesz musiał przejść kod źródłowy JDK i znaleźć wszystkie funkcje natywne, które spowodowały otwarcie pliku (zaśmiecone w java.io. , java.nio., Myślę, że java.net. * Również, jeśli uznasz gniazda za uchwyty plików, i prawie wszędzie, gdzie uchwyt pliku może być otwierany przez funkcję natywną), a następnie zapakuj je wszystkie za pomocą wywołania SetNativeMethodPrefix.

Zakładam, że to właśnie robią niektórzy z osób zajmujących się profilowaniem: jeśli jednak nie jest się zobowiązanym do zrobienia tego wpisu w czasie rzeczywistym, to myślę, że byłoby łatwiej używać lsof lub handle (w systemie Windows platformy) i filtr dla identyfikatora procesu JVM.