获取这个怪异的错误:
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
问题在于where
子句,尽管Map
显然具有大小方法。
@ruakh的答案很好,除了一件小事情。有时可能是一个段,这会使sum(x.segments, 'it.count')
弄乱。用
sum(x.segments, 'it != null ? it.count : 0')
它可以正常工作。对我的话进行测试。
浏览VisualVM OQL文档,我没有得到它支持Java方法调用的印象,只有Java字段。(他们的一些示例包括.toString()
,但这显然是JavaScript .toString()
,而不是Java,因为他们使用它将Java String
对象转换为JavaScript字符串。)所有人使用私有字段count
而不是公共方法length()
,其矢量示例使用私有字段elementCount
而不是公共方法size()
。
所以您遇到的错误是因为ConcurrentHashMap
没有名为size
的字段。
不幸的是,对于您的查询,ConcurrentHashMap
不会将其大小存储在字段中&mdash;这将损害其避免阻止&mdash的能力;所以我认为您必须写这样的东西:
select { map: x }
from java.util.concurrent.ConcurrentHashMap x
where sum(x.segments, 'it.count') < 10
自己总结所有细分尺寸。(免责声明:100%完全未经测试。)