Почему не работает опция -baseline в jhat?
Почему каждый объект помечается как новый, а не только объекты, которые находятся во втором снимке, но отсутствуют в моем базовом снимке? Оглядываясь в Интернете, я вижу некоторые предложения, что мне нужно использовать hprof вместо jmap для создания дампов памяти, но похоже, что hprof генерирует дампы в точно таком же формате.
Это JDK 1.6.0_14; Я пробовал как на Windows, так и на UNIX.
2 ответа
jhat -baseline
на самом деле не будет работать с дампами, созданными jmap
, Я не уверен, но я полагаю, что это связано с тем, что hprof подключается к JVM с самого начала и отслеживает объекты, что позволяет ему генерировать согласованные идентификаторы для нескольких дампов. Не цитируйте меня об этом. В любом случае, важно отметить, что дампы jmap не работают.
Однако еще не все потеряно. Идите и получите анализатор памяти Eclipse. (Если вы не используете Eclipse, не бойтесь, вы можете получить его как отдельный исполняемый файл.) Он быстрее, чем jhat, использует меньше памяти, чем jhat, и может делать то, что вы хотите:
- Откройте dump2 (с помощью File|Open Heap Dump). Не беспокойтесь о том, чтобы создать отчет для вас.
- Откройте dump1 (так же). Опять нет отчета.
- На вкладке для dump2 нажмите "Гистограмма"
- Справа от панели инструментов во вложенной вкладке "Гистограмма" находится "Сравнить с другим дампом кучи". Нажмите на это.
- Выберите dump1 в вашем диалоге в качестве дампа для использования в качестве базовой линии.
- Presto, у вас есть различия между dump2 и базовым dump1.
Все это прекрасно работает с дампом jmap.
Похоже, вам нужно использовать hprof. Но вы уверены, что используете тот же экземпляр виртуальной машины?
Опция -baseline позволяет сравнивать два дампа, если они были созданы HPROF и из одного и того же экземпляра виртуальной машины. Если в обоих дампах появляется один и тот же объект, он будет исключен из списка новых зарегистрированных объектов. Один дамп указывается как базовый уровень, и анализ может фокусироваться на объектах, созданных во втором дампе с момента получения базового уровня.
Если все будет считаться новым, я позабочусь о том, чтобы это был тот же экземпляр виртуальной машины.