OQL для поиска экземпляров, реализующих java.security.Principal.

Похоже, что это не возвращает никакого результата от Netbeans (который имеет те же инструменты анализа кучи, что и VisualVM):

select x.name from java.security.Principal x

Запрос работает, если я укажу имя конкретного класса, реализующего Principal, но мне понадобятся все реализации.

Пробовал то же самое в Eclipse Memory Analyzer, те же результаты.

Любая подсказка?


person ymajoros    schedule 30.01.2014    source источник


Ответы (2)


Дамп кучи не содержит информации о том, какие классы реализуют тот или иной интерфейс. Единственная информация, доступная в дампе кучи, касается суперкласса. NetBeans Profiler может преодолеть этот недостаток — если вы берете дамп кучи во время профилирования или мониторинга проекта NetBeans, он может вычислить классы, реализующие конкретный интерфейс из проекта.

person Tomas Hurka    schedule 13.02.2014
comment
Спасибо. Итак, как попросить об этом Netbeans? - person ymajoros; 13.02.2014
comment
Просто откройте свой проект в NetBeans и вызовите Profile Project. Вы можете использовать только режим мониторинга, и после запуска приложения сделайте дамп кучи. - person Tomas Hurka; 14.02.2014
comment
Хорошо, пропустил слово Profiler в вашем решении. Нет, это производственные дампы кучи, и я не могу профилировать эти серверы. Спасибо, в любом случае. - person ymajoros; 14.02.2014

Оператор JHAT OQL 'instanceof' не работает с типами интерфейса ОШИБКА закрыта как < strong>Не исправить, поскольку текущий формат дампа кучи не содержит такой информации. Есть:

BT2: ВРЕМЕННОЕ РЕШЕНИЕ

Вручную найдите все классы реализации, доступные в моментальном снимке кучи (например, путем поиска в файлах JAR). Помимо трудности и ненадежности поиска всех возможных классов реализации, результат будет не очень удовлетворительным, потому что вы вынуждены либо

  1. Запускайте отдельный запрос OQL для каждого реализующего класса, что затрудняет просмотр всех результатов в одном месте.

or

  1. Используйте «из объекта o» и отфильтруйте результаты, проверив тип, который, вероятно, будет чрезмерно медленным, поскольку он будет проходить через каждый объект в куче.

Если у вас есть предположения об именах классов или пакетов, вы можете использовать такой запрос, чтобы найти подходящих кандидатов:

filter(heap.classes(), "/org\\.hibernate\\.cfg\\.naming/(it.name)")

Вы можете сохранить результат поиска через:

x = toArray(filter(..., ...))

а затем запросите подробную информацию, не дожидаясь исходного запроса:

map(x, "{cl: it, sub: it.subclasses(), sup: it.superclasses()}")
person gavenkoa    schedule 24.12.2015