在 OQL 的堆转储中获取类的静态字段

Posted

技术标签:

【中文标题】在 OQL 的堆转储中获取类的静态字段【英文标题】:get static fields of a class in a heap dump in OQL 【发布时间】:2010-10-20 09:38:10 【问题描述】:

我有一个堆转储,我正在使用 Eclipse MAT,不过我想这应该可以通过 visualvm 或任何 OQL 客户端工作。

我们可以选择一个类的所有实例的字段

select s.field1, s.field2 from org.me.MyClass

...但这仅限于成员变量和带有实例的类型。

如何选择没有实例的类的静态字段?

这和this other question有点关系。

【问题讨论】:

【参考方案1】:

要访问 java.lang.System 类的静态字段“props”,您可以使用(在 VisualVM 中)

select heap.findClass("java.lang.System").statics.props
select heap.findClass("java.lang.System").props

【讨论】:

太好了,谢谢。这两个都有效。 select heap.findClass("java.lang.System").statics 提供了类似从字段名称到值的映射,这很方便。 虽然问题中没有要求这样做,但值得注意的是,这不会在 Eclipse MAT OQL 中执行。【参考方案2】:

这有点骇人听闻,但在 MAT 中有效:

SELECT c.SIZE
FROM INSTANCEOF java.lang.Class c
WHERE c.@displayName.contains("class java.lang.Integer ")

【讨论】:

非常聪明,为我工作,除了它也选择了内部类。我尝试使用 c.@name,它在选择列表中有效,但在 where 子句中无效。 c 似乎在 where 子句中是 IClass(Class 的 MAT 表示),而在选择列表中是 java.lang.Class,它是如何工作的?

以上是关于在 OQL 的堆转储中获取类的静态字段的主要内容,如果未能解决你的问题,请参考以下文章

如何从正在运行的应用程序的堆转储中提取 java 类定义?

静态值类型字段是不是在 C# 的堆中装箱?

kill -3 获取java线程转储

Eclipse MAT 的 ParseHeapDump 实用程序可以运行 OQL 吗?

Eclipse MAT OQL 某个包中的类列表

java field获取值