Как я могу получить доступ к объектам кучи Java без ссылки?

Я хотел бы получить ссылку на все объекты в куче Java, даже если у меня нет немедленной ссылки на эти объекты в моем активном потоке. Мне не нужны нессылочные объекты (те, что «в очереди» для сборки мусора), но я хотел бы получить все, что все еще используется.

Цель состоит в том, чтобы сериализовать и сохранить все объекты, чтобы реализовать постоянство состояния выполнения бедняка. Я понимаю, что кроличья нора углубляется, когда дело доходит до различных типов переходных состояний, но мне было бы полезно просто сохранять объекты и загруженные определения классов.

Есть ли способ получить доступ к куче, чтобы это произошло? Я упускаю из виду более прямой подход?


person G__    schedule 05.09.2009    source источник
comment
Вы хотите получить дамп кучи? Или вы хотите получить доступ к постоянному поколению?   -  person Vineet Reynolds    schedule 06.09.2009
comment
Меня интересует прежде всего доступ к объектам из кучи (программно!). PermGen дал бы мне определения классов, которые тоже представляют интерес, но я стараюсь сосредоточить внимание на своем вопросе. :-)   -  person G__    schedule 06.09.2009


Ответы (3)


Я бы посмотрел на инструмент пакет. Инструментируйте интересующие вас классы, чтобы ctor зарегистрировал созданный экземпляр. Возможно, вы сможете сделать это с помощью AspectJ, если вы не хотите использовать java.lang.instrument или если объекты создаются с помощью чего-то, что вы можете контролировать (контейнер IoC или фабрики), тогда вы можете сделать что-то менее волшебное.

person Michael Lloyd Lee mlk    schedule 05.09.2009
comment
Мне нравится этот подход, так как он дает мне хорошую возможность работать с объектами. Спасибо. - person G__; 06.09.2009

Если вы хотите получить дамп кучи программно, вы не найдете подходящих API в пространстве имен java.* или javax.*. Однако среда выполнения Sun поставляется с HotSpotDiagnosticMXBean, который позволит вам сделать дамп кучи, записав содержимое кучи в указанный файл на диске.

person Vineet Reynolds    schedule 05.09.2009

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

Доступные представления позволяют переходить на уровень экземпляра и просматривать свойства объекта. Вы даже можете запрашивать объекты, используя OQL и SQL-подобный язык запросов для объектов.

Левая панель на снимке экрана ниже демонстрирует проверку значений полей.

скриншот http://img181.imageshack.us/img181/4013/dominatortreegrouped.png

person Robert Munteanu    schedule 05.09.2009
comment
Согласен с MattC - это довольно круто, и я хочу это проверить, но меня в первую очередь интересует, как это сделать с помощью кода в той же JVM. - person G__; 06.09.2009