【发布时间】:2020-01-03 17:15:55
【问题描述】:
我想在 VisualVM (v1.4.4) 中 execute an OQL query 检索对象的(非静态)字段名称。
OQL 文档描述了heap.findClass(className)。这将返回一个包含 fields 属性(字段名称数组)的对象。
当我执行以下 OQL...
heap.findClass('java.io.ByteArrayInputStream').fields;
...它返回一个包含 4 个字段对象的数组(ByteArrayInputStream has 4 fields - buf、count、mark 和 pos - 我假设这些是返回的内容):
org.netbeans.lib.profiler.heap.HprofField@56de8c
org.netbeans.lib.profiler.heap.HprofField@56de95
org.netbeans.lib.profiler.heap.HprofField@56de9e
org.netbeans.lib.profiler.heap.HprofField@56dea7
如果我随后尝试操作此数组,例如访问每个字段的 name 和 signature 属性(如 OQL 文档中所述),我不会得到任何结果。我什至无法获得数组的长度。例如:
heap.findClass('java.io.ByteArrayInputStream').fields.length;
和:
heap.findClass('java.io.ByteArrayInputStream').fields[0];
以上两个语句都返回<no results>。
我做错了什么?可能是一些基本的事情。就此而言,我对 JavaScript 或者数据在 VisualVM 中的显示方式不是很熟悉。
【问题讨论】:
-
嗨!我也是 OQL 的新手,您是否尝试使用前缀 select 进行查询说 select heap.findClass('java.io.ByteArrayInputStream').fields;
-
不 - 我没有使用
select语法。只是原生 JavaScript,如上所示。 (顺便说一句,如果我使用select语法,我会得到相同的结果 - 我刚刚尝试过)。
标签: javascript jvm visualvm oql