Javascript VisualVM中的OQL-递归打印包中的静态数据

Javascript VisualVM中的OQL-递归打印包中的静态数据,javascript,jvm,visualvm,oql,Javascript,Jvm,Visualvm,Oql,我想构建一个递归打印JVM堆转储中特定包中类的所有静态数据的工具。我知道递归地遍历内存引用可能会有很多问题,但是(至少在最初)我将通过设置深度阈值来缓解这些问题 根据文档,类有一个statics字段,该字段依次由names和values组成: statics—类的静态字段的名称、值对 我在使用field.name表达式获取每个静态字段的名称时遇到了停顿,不知道如何迭代对象的非静态字段。我目前有: select map( filter( filter(heap.classe

我想构建一个递归打印JVM堆转储中特定包中类的所有静态数据的工具。我知道递归地遍历内存引用可能会有很多问题,但是(至少在最初)我将通过设置深度阈值来缓解这些问题

根据文档,类有一个
statics
字段,该字段依次由
name
s和
value
s组成:

statics—类的静态字段的名称、值对

我在使用
field.name
表达式获取每个静态字段的名称时遇到了停顿,不知道如何迭代对象的非静态字段。我目前有:

select map(
    filter(
        filter(heap.classes(), "/com.heap./.test(it.name)"),
        function (clazz) {
            if (clazz.statics) {
                return true;
            }
            return false;
        }
    ), function (clazz) {
        var res = '';
        res += toHtml(clazz.name) + " : " + toHtml(clazz.statics) + "<br>";
        map(clazz.statics, function (field) {
            res += "--" + toHtml(field) + "," + toHtml(field.name) + "," + toHtml(field.state) +"<br>";
        });
        return res + "<br>";
    }
)
我正在使用下面的
map()
函数迭代
clazz.statics

看起来
field
参数只是字段的值,因为
field.name
总是
null
,而
field.state
实际上检索其中一个对象上的字段(
com.heap.dump.DataHolder.state

主要问题:

  • 在迭代静态字段时,除了值之外,如何获得字段名
  • 一旦有了要遍历的对象/实例,如何迭代该对象的非静态字段(名称和值)?获取字段值的方法,就像是
    field.state
    语句一样,只有在我已经知道字段名的情况下才有帮助,这里不是这样
其他问题:

  • 如何筛选出空的命名AppClassLoader静态字段
  • 我用错工具了吗?有没有比VisualVM的OQL更简单的替代方案

statics
是一个映射,因此您应该使用(…)对其进行迭代。我更新了你的查询。见下文:

select map(
    filter(
        filter(heap.classes(), "/com.heap./.test(it.name)"),
        function (clazz) {
            if (clazz.statics) {
                return true;
            }
            return false;
        }
    ), function (clazz) {
        var res = '';
        res += toHtml(clazz.name) + " :<br>";
        for (field in clazz.statics) {
            res += "-- " + toHtml(field) + ", " + toHtml(clazz.statics[field]) +"<br>";
        }
        return res + "<br>";
    }
)
选择地图(
滤器(
过滤器(heap.classes(),“/com.heap./.test(it.name)”),
功能(clazz){
if(分类静力学){
返回true;
}
返回false;
}
),函数(clazz){
var-res='';
res+=toHtml(clazz.name)+“:
”; 用于(类别静力学中的字段){ res+=“-”+toHtml(字段)+“,“+toHtml(clazz.statics[field])+”
”; } 返回res+“
”; } )
您的答案没有解决第二个主要问题,即如何开始迭代每个字段的子字段。不过还是很有帮助的,谢谢!
select map(
    filter(
        filter(heap.classes(), "/com.heap./.test(it.name)"),
        function (clazz) {
            if (clazz.statics) {
                return true;
            }
            return false;
        }
    ), function (clazz) {
        var res = '';
        res += toHtml(clazz.name) + " :<br>";
        for (field in clazz.statics) {
            res += "-- " + toHtml(field) + ", " + toHtml(clazz.statics[field]) +"<br>";
        }
        return res + "<br>";
    }
)