这似乎没有从Netbeans返回任何结果(Netbeans具有与VisualVM相同的堆分析工具):
select x.name from java.security.Principal x
如果我把一个具体类的名称实现为Principal,但查询有效,但我需要所有实现。
在Eclipse Memory Analyzer中尝试过相同的结果。
有任何线索吗?
答案 0 :(得分:2)
堆转储没有哪些类实现特定接口的信息。堆转储中唯一可用的信息是关于超类。 NetBeans Profiler可以克服这个缺点 - 如果您进行堆转储,同时分析或监视NetBeans项目,它可以计算从项目实现特定接口的类。
答案 1 :(得分:0)
JHAT OQL 'instanceof' operator does not work with interface types BUG因赢得修复而关闭,因为当前堆转储格式没有此类信息。有:
BT2:周围的工作
手动查找堆快照中可用的所有实现类(例如,通过搜索JAR 文件)。除了找到所有可能的impl类的困难和不可靠性之外,还有 结果不会很令人满意,因为你被迫
- 为每个实现类运行单独的OQL查询,这使得很难在一个实现中查看所有结果 的地方。
醇>或
- 使用'来自对象o'并通过检查可能的类型来过滤结果 由于它会遍历堆中的每个对象,因此速度过慢。
醇>
如果您对类名或包有一些猜测,可以使用这样的查询来找到合适的候选者:
filter(heap.classes(), "/org\\.hibernate\\.cfg\\.naming/(it.name)")
您可以通过以下方式保存搜索结果:
x = toArray(filter(..., ...))
然后在不等待原始查询的情况下查询详细信息:
map(x, "{cl: it, sub: it.subclasses(), sup: it.superclasses()}")