1

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

select x.name from java.security.Principal x

如果我输入实现 Principal 的具体类的名称,则查询有效,但我需要所有实现。

在 Eclipse 内存分析器中尝试了相同的结果,结果相同。

有什么线索吗?

4

2 回答 2

2

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

于 2014-02-13T12:53:35.533 回答
0

JHAT OQL 'instanceof' 运算符不适用于接口类型BUG 关闭为Won't fix因为当前堆转储格式没有此类信息。有:

BT2:解决方法

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

  1. 为每个实现类运行一个单独的 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()}")
于 2015-12-24T19:35:12.307 回答