OQL用于查找实现java.security.Principal的实例

时间:2014-01-30 14:25:19

标签: java netbeans visualvm heap-dump oql

这似乎没有从Netbeans返回任何结果(Netbeans具有与VisualVM相同的堆分析工具):

select x.name from java.security.Principal x

如果我把一个具体类的名称实现为Principal,但查询有效,但我需要所有实现。

在Eclipse Memory Analyzer中尝试过相同的结果。

有任何线索吗?

2 个答案:

答案 0 :(得分:2)

堆转储没有哪些类实现特定接口的信息。堆转储中唯一可用的信息是关于超类。 NetBeans Profiler可以克服这个缺点 - 如果您进行堆转储,同时分析或监视NetBeans项目,它可以计算从项目实现特定接口的类。

答案 1 :(得分:0)

JHAT OQL 'instanceof' operator does not work with interface types BUG因赢得修复而关闭,因为当前堆转储格式没有此类信息。有:

  

BT2:周围的工作

     

手动查找堆快照中可用的所有实现类(例如,通过搜索JAR   文件)。除了找到所有可能的impl类的困难和不可靠性之外,还有   结果不会很令人满意,因为你被迫

     
      
  1. 为每个实现类运行单独的OQL查询,这使得很难在一个实现中查看所有结果   的地方。
  2.         

         
        
    1. 使用'来自对象o'并通过检查可能的类型来过滤结果   由于它会遍历堆中的每个对象,因此速度过慢。
    2.   

如果您对类名或包有一些猜测,可以使用这样的查询来找到合适的候选者:

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

您可以通过以下方式保存搜索结果:

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

然后在不等待原始查询的情况下查询详细信息:

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