这似乎没有从 Netbeans(它具有与 VisualVM 相同的堆分析工具)返回任何结果:
select x.name from java.security.Principal x
如果我输入实现 Principal 的具体类的名称,则查询有效,但我需要所有实现。
在 Eclipse 内存分析器中尝试了相同的结果,结果相同。
有什么线索吗?
堆转储没有哪些类实现特定接口的信息。堆转储中唯一可用的信息是关于超类的。NetBeans Profiler 可以克服这个缺点 - 如果您在分析或监视 NetBeans 项目时进行堆转储,它可以计算实现项目中特定接口的类。
JHAT OQL 'instanceof' 运算符不适用于接口类型BUG 关闭为Won't fix因为当前堆转储格式没有此类信息。有:
BT2:解决方法
手动查找堆快照中可用的所有实现类(例如通过搜索 JAR 文件)。除了找到所有可能的 impl 类的难度和不可靠性之外,结果也不会很令人满意,因为你被迫要么
- 为每个实现类运行一个单独的 OQL 查询,使得很难在一个地方查看所有结果。
或者
- 使用“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()}")