Мы можем просмотреть объекты в памяти JVM?

На работе мы нашли, что на некоторых экземплярах (особенно медленные) у нас есть другое поведение, полученное в перезагрузке.

Мы предполагаем, что кэш не инициализируется правильно, или возможно проблема параллелизма... Так или иначе это не воспроизводимо ни в каком другом ENV, чем производство.

У нас на самом деле нет регистраторов для активации... это - старый компонент...

Таким образом я хотел бы знать, существуют ли инструменты, которые могут помочь нам видеть другой objets, существующий в памяти JVM для проверки содержания кэша...

Спасибо!

Править:

У меня нет доступа к рабочим серверам непосредственно, наш сервер приложений является weblogic 10, у меня нет указателя на объект, но я знаю тип объекта кэша...

Edit2:

Наши серверы работают на jre 1.5, действительно ли возможно использовать jmap? Не может найти его в jdk5 :( кроме того, удаленная отладка могла быть хорошей, но мы не можем из соображений безопасности...

Edit3:

На самом деле jhat + VisualVM хорошо для меня, я нашел свой объект в дампе, но я не могу считать hashmap (объект, содержащий приблизительно 60 000 объектов) правильно... Существует ли инструмент для чтения concurrenthashmap дружественным способом? я должен найти значение ключа (или его существование в карте), не просматривая вручную записи 60k. На самом деле я читал на форуме ЦИНОВКИ затмения, что это также не возможно с ним...

Edit4: После некоторых событий мне действительно нравятся инструменты как VisualVM. Также используемый YourKit. Существуют некоторые полезные функции как OQL для нахождения правильных экземпляров, на которые необходимо посмотреть...

9
задан Sebastien Lorber 16 August 2011 в 13:12
поделиться

3 ответа

Это в основном для того, чтобы расширить то, что сказал Уилл. Я добился большого успеха, попросив наших администраторов сделать heapdump наших производственных систем, хотя с оговоркой, что конкретный сервер, на который вы делаете дамп, не будет реагировать, пока дамп не завершится. Затем получите этот файл и используйте плагин Eclipse MAT для его просмотра. Если вам не нравится Eclipse, можно также использовать Netbeans и простой плагин VisualVM. Однако это может создать несколько больших файлов, и вам может понадобиться запуск на 64-битной системе.

7
ответ дан 4 December 2019 в 14:27
поделиться

Есть ли у вас доступ к дескриптору / указателю на объекты? Если это так, вы можете запустить его в режиме отладки и посмотреть в отладчике, таком как Eclipse. Это позволит вам проверять переменные и тому подобное.

Как вариант, вы можете написать небольшой регистратор, который рефлексивно проходит по классу и регистрирует, что происходит. Все это предполагает, что у вас есть место, где вы можете начать входить в код или получить ссылку на кешированные значения.


edit: Как я отмечал в своем комментарии, я не знаю способа получить доступ к объекту без какой-либо ссылки или ссылки на ссылки. Например, инкапсулирован ли объект в другом объекте? Если это так, вы можете сделать что-то вроде следующего:

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());
}

Вы также можете сделать что-то вроде:

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

Обратите внимание, что все методы отражения вызывают исключения, поэтому вам нужно будет обработать их соответствующим образом. Кроме того, setAccessible (true) означает, что вы можете получить доступ к закрытым полям и методам объекта. Это ЧРЕЗВЫЧАЙНО ОПАСНО - используйте его только в случае крайней необходимости.

3
ответ дан 4 December 2019 в 14:27
поделиться

Достаточно легко запустить jmap для сброса COUNT экземпляров объекта, но я не знаю, действительно ли это вас интересует.

Вы также можете использовать jmap для создания дампа всей кучи, и с помощью этого (и jhat) вы можете увидеть ВЗАИМООТНОШЕНИЯ между объектами (т.е.какой объект на что указывает), но не обязательно СОДЕРЖАНИЕ объекта.

Конечно, данные находятся в дампе кучи, они не отображаются "щелчком мыши".

Я думаю, что некоторые профессиональные профилировщики позволят вам анализировать объекты в куче.

В противном случае вам было бы лучше добавить в приложение некоторые специальные инструменты, чтобы обеспечить конкретный самоанализ, который вы ищете, запускаемый пользовательским кодом, JMX или чем-то еще.

4
ответ дан 4 December 2019 в 14:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: