2010-05-11 13 views
7

W pracy okazało się, że w niektórych przypadkach (szczególnie tych powolnych) mamy inne zachowanie, nabyte przy ponownym uruchomieniu komputera.Czy możemy wyświetlić obiekty w pamięci JVM?

Domyślamy się, że pamięć podręczna nie została poprawnie zainicjalizowana lub może problem z współbieżnością ... W każdym razie nie można jej odtworzyć w żadnym innym środowisku niż w przypadku produkcji.

My faktycznie nie mają rejestratory aby aktywować ... to stary komponent ...

Dlatego chciałbym wiedzieć, czy istnieją narzędzia, które mogą pomóc nam zobaczyć różne objets obecne w pamięć JVM, aby sprawdzić zawartość pamięci podręcznej ...

Dziękujemy!

Edit:

nie mam dostępu do serwerów produkcyjnych bezpośrednio, nasz serwer aplikacji jest WebLogic 10, nie mam wskaźnik do obiektu, ale wiem, że typ obiektu cache .. .

Edit2:

Nasze serwery są uruchomione na JRE 1.5, możliwe jest użycie jmap? nie można go znaleźć w jdk5 :( Również zdalne debugowanie może być ładne, ale nie możemy ze względów bezpieczeństwa ...

Edit3:

Właściwie jhat + VisualVM jest ok dla mnie, znalazłem mój obiekt w dump, ale nie jestem w stanie odczytać hashmap (obiekt zawierający około 60000 elementów) prawidłowo ... Czy istnieje narzędzie do czytania concurrenthashmap w przyjazny sposób? Muszę znaleźć wartość klucza (lub jego istnienie na mapie) bez ręcznego przeglądania rekordów 60 000. Właściwie czytam na forum Eclipse MAT, że nie jest to również możliwe z tym ...

Edit4: Po pewnych doświadczeniach bardzo lubię narzędzia takie jak VisualVM. Używał również YourKit. Istnieje kilka przydatnych funkcji, takich jak OQL, aby znaleźć odpowiednie instancje, na które należy spojrzeć ...

+0

Nie wiem, w jaki sposób uzyskać dostęp do obiektu bez odniesienia do wskaźnika/zmiennej. – aperkins

Odpowiedz

6

Jest to zasadniczo rozszerzenie na to, co powiedział Will. Osiągnąłem wielki sukces, ponieważ nasi administratorzy wykonują stertę naszych systemów produkcyjnych, ale z zastrzeżeniem, że dany serwer, który wysyłasz, nie będzie reagował do czasu zakończenia zrzutu. Następnie pobierz ten plik i za pomocą wtyczki Eclipse MAT, aby go obejrzeć. Jeśli nie lubisz Eclipse, możesz również użyć Netbeans i zwykłą wtyczkę VisualVM. Może to jednak spowodować utworzenie dużych plików, może być konieczne uruchomienie systemu 64-bitowego.

+1

+1 dla VisualVM – ykaganovich

+0

+1 dla Eclipse MAT - to najpotężniejszy (darmowy) wizualizer sterty. Wysoce zalecane i ma niesamowite wtyczki, aby spojrzeć na kupę w ciekawy sposób (na przykład wypełnienie kolekcji%!). –

3

Czy masz dostęp do uchwytów/wskaźników do obiektów? Jeśli tak, możesz uruchomić go w trybie debugowania i obejrzeć go w debugerze takim jak Eclipse. Umożliwi to sprawdzenie zmiennych i tym podobnych.

Ewentualnie możesz napisać mały rejestrator, który w sposób refleksyjny przejdzie przez klasę i zarejestruje, co się dzieje. Wszystko to zakłada, że ​​masz lokalizację, w której możesz zacząć wkraczać do kodu lub możesz uzyskać odniesienie do wartości zapisanych w pamięci podręcznej.


edit: Jak zauważyłem w moim komentarzu, nie wiem o sposób, aby uzyskać dostęp do obiektu bez jakiegoś odniesienia lub link odniesień. Na przykład, czy obiekt jest zamknięty w innym obiekcie?Jeśli tak, można zrobić coś jak następuje:

Class<?> objectClass = myPointer.getClass(); 
Field[] objectFields = objectClass.getDeclaredFields(); 
for (Field field : objectFields) { 
    field.setAccessible(true); 
    //Or whatever you would need to do to get the information you need 
    System.out.println(field.get(myPointer).toString()); 
} 

Można też zrobić coś takiego:

Field targetField = objectClass.getDeclaredField("myFieldName"); 
targetField.setAccessible(true); 
MyOldObjectType target = (MyOldObjectType)targetField.get(myPointer); 
//do whatever you need to do here 

pamiętać, że wszystkie odbicia metod generują wyjątki, więc trzeba będzie obsłużyć te jako właściwy. Ponadto, setAccessible(true) oznacza, że ​​możesz uzyskać dostęp do prywatnych pól i metod na obiekcie. To jest NIEZWYKLE NIEBEZPIECZNY - Używaj go tylko, jeśli koniecznie musisz.

+0

Nie sądzę, że taki debugger jak obecny w Eclipse jest opcją, ponieważ "nie można go odtworzyć w żadnym innym środowisku niż w produkcji". –

+1

@Andrew Hubbs: Osobiście użyłem debugowania Eclipse w środowisku produkcyjnym - musisz uruchomić system w trybie debugowania i skonfigurować go do zdalnego połączenia. Są tam opcje - nie jest to łatwe, ale jest to możliwe. – aperkins

+0

nasze serwery nie znajdują się w tym samym mieście, nie wiem, czy mogą uruchomić weblogię produkcyjną w trybie debugowania i nie wiedzą, czy dadzą mi dostęp przez tunel ... –

4

Jest to dość łatwe do uruchomienia jmap zrzucić hrabiego instancji obiektów, ale nie wiem, czy to, co naprawdę jesteś zainteresowany.

Można również użyć jmap zrobić zrzut sterty cała sterty, a wraz z nią (i jhat) można zobaczyć obiekt RELACJE (tj. jaki obiekt wskazuje na co), ale niekoniecznie obiekt SPIS TREŚCI.

Oczywiście dane znajdują się w zrzucie sterty, nie jest widoczne "kliknięcie".

Niektóre z profesjonalnych profilerów, które moim zdaniem pozwolą Ci na introspekcję obiektów w zrzucie sterty.

W tym miejscu lepiej byłoby dodać do aplikacji pewne specyficzne oprzyrządowanie, aby zapewnić konkretną introspekcję, której szukasz, wywołaną przez niestandardowy kod, JMX lub cokolwiek innego.

+0

+1 - Nie wiedziałem o wysypisku sterty. Byłoby to naprawdę przydatne miesiąc lub dwa dla mnie :) – aperkins

+0

Używamy java 1.5 Czy można używać jmap na 1.5 jre? Znalazłem jmap tylko na jdk6 i nie mogło działać z moim lokalnym jre 1.5 ... –