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

8
我有一个堆转储文件,并且我正在使用Eclipse MAT进行分析,不过我想这个方法也适用于VisualVM或者任何OQL客户端。
我们可以通过以下方式选择一个类的所有实例的字段:
select s.field1, s.field2 from org.me.MyClass

...但这仅限于成员变量,以及具有实例的类型。

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

这与另一个问题有些相关。

2个回答

10

这个方法有些hackish,但在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,这是怎么回事? - haridsv

7
要在 VisualVM 中访问 Java.lang.System 类的静态字段 'props',您可以使用以下方法:
select heap.findClass("java.lang.System").statics.props
select heap.findClass("java.lang.System").props

1
太好了,谢谢。这两个都可以。select heap.findClass("java.lang.System").statics 返回类似于从字段名称到值的映射表,非常方便。 - Joe Kearney
2
虽然问题中没有要求,但值得注意的是这在Eclipse MAT OQL中无法执行。 - Joe Kearney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接