在 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 的堆转储中获取类的静态字段的主要内容,如果未能解决你的问题,请参考以下文章