分析堆dum,Map#size()不是函数吗?

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显然有一个大小方法.

rua*_*akh 2

浏览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% 完全未经测试。)