分析堆转储,Map#size()不是一个函数?

7

遇到了这个奇怪的错误:

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显然具有size方法,但它似乎无法正常工作。
2个回答

3

@ruakh的回答非常好,只有一个小问题。有时候一个段落可能为空,这会导致sum(x.segments, 'it.count')出现混乱。请将其替换为

sum(x.segments, 'it != null ? it.count : 0')

并且它会正常工作。根据我的话进行了测试。

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

要自己计算所有片段的大小。(免责声明:100%完全未经测试。)


糟糕 - 我之前的网址似乎有点混乱:我想说的是 http://eclipse.org/forums/index.php/m/564977/ 和 http://www.eclipse.org/forums/index.php/m/3655/ (结尾的斜杠很重要)。 - Brian Henry
@BrianHenry:啊,好的;这些页面无限相关,谢谢。 (为什么一个斜杠会有如此大的差别?谁会那样编写Web软件?!) - ruakh
我以前从未见过这样的东西。但为什么它被写成那样,或许是另一个StackOverflow帖子的问题... - Brian Henry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接