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

问题出在该子句上,尽管显然有一个 size 方法where,但它以某种方式不起作用。Map

4

2 回答 2

3

@ruakh 的回答很好,除了一件小事。一个段有时可能是空的,这搞砸了sum(x.segments, 'it.count')。将其替换为

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

它会正常工作。经我的话考验。

于 2013-04-09T20:54:00.667 回答
2

翻阅VisualVM OQL 文档,我没有得到它支持 Java 方法调用的印象,只支持 Java 字段。(他们的一些示例包括.toString(),但这显然是 JavaScript.toString()而不是 Java 的,因为他们使用它来将 JavaString对象转换为 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% 完全未经测试。)

于 2012-11-08T19:39:04.280 回答