Pab*_*dez 6 java heap visualvm oql
得到这个奇怪的错误:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: size is not a function, it is null. (#1)
在分析堆转储并在VisualVM上运行此OQL查询时:
select { map: x }
from java.util.concurrent.ConcurrentHashMap x
where x.size() < 10
Run Code Online (Sandbox Code Playgroud)
问题在于该where条款,不管怎么说它没有用,虽然Map显然有一个大小方法.
浏览VisualVM OQL 文档,我没有得到它支持 Java 方法调用的印象,仅支持 Java 字段。(他们的一些示例包括.toString(),但这显然是 JavaScript.toString()而不是 Java 的,因为他们使用它将 Java 对象转换String为 JavaScript 字符串。)因此,例如,他们的字符串长度示例都使用私有字段count而不是公共方法length(),并且他们的向量长度示例使用私有字段elementCount而不是公共方法size()。
所以您收到的错误是因为ConcurrentHashMap没有名为 的字段size。
不幸的是,对于您的查询,ConcurrentHashMap不会将其大小存储在字段中 - 这会损害其避免阻塞的能力 - 所以我认为您必须编写如下内容:
select { map: x }
from java.util.concurrent.ConcurrentHashMap x
where sum(x.segments, 'it.count') < 10
Run Code Online (Sandbox Code Playgroud)
自己计算所有段大小的总和。(免责声明:100% 完全未经测试。)