これは、Netbeans (VisualVM と同じヒープ分析ツールを持っています) から結果を返さないようです:
select x.name from java.security.Principal x
プリンシパルを実装する具体的なクラスの名前を入力すると、クエリは機能しますが、すべての実装が必要になります。
Eclipse Memory Analyzer で同じことを試してみましたが、同じ結果でした。
どんな手掛かり?
ヒープ ダンプには、どのクラスが特定のインターフェイスを実装しているかの情報はありません。ヒープ ダンプで利用できる唯一の情報は、スーパークラスに関するものです。NetBeans プロファイラーは、この欠点を克服できます。NetBeans プロジェクトのプロファイリングまたは監視中にヒープ ダンプを取得すると、プロジェクトから特定のインターフェースを実装するクラスを計算できます。
JHAT OQL 'instanceof' 演算子はインターフェイス タイプでは機能しません現在のヒープ ダンプ形式にはそのような情報がないため、修正されないというバグがクローズされました。がある:
BT2:回避策
ヒープ スナップショットで使用可能なすべての実装クラスを手動で見つけます (たとえば、JAR ファイルを検索して)。可能性のあるすべての impl クラスを見つけることの難しさと信頼性の欠如に加えて、結果はあまり満足のいくものではありません。
- 実装クラスごとに個別の OQL クエリを実行すると、すべての結果を 1 か所で確認することが難しくなります。
また
- 「from Object o」を使用し、タイプをチェックして結果をフィルタリングします。これは、ヒープ内のすべてのオブジェクトをトラバースするため、非常に遅くなる可能性があります。
クラス名またはパッケージについて推測がある場合は、次のようなクエリを使用して適切な候補を見つけることができます。
filter(heap.classes(), "/org\\.hibernate\\.cfg\\.naming/(it.name)")
次の方法で検索結果を保存できます。
x = toArray(filter(..., ...))
元のクエリを待たずに詳細情報をクエリします。
map(x, "{cl: it, sub: it.subclasses(), sup: it.superclasses()}")