分析堆转储,地图#size()不是函数



获取这个怪异的错误:

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

相关内容

  • 没有找到相关文章

最新更新