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