我想知道如何搜索匹配特定数字的所有原始浮点值。
做类似的事情时:
select n from java.lang.Float n where n.value == 1.00
仅找到Float类实例。我正在探索的应用程序使用的不同包装器不仅仅是Float(例如,Vectors),它使用原始浮点值作为我需要搜索的字段。
我将如何做到这一点?
以下内容返回“找不到浮动错误”:
select n from float n where n.value == 1.00
答案 0 :(得分:3)
原始值仅作为结构中的字段存在(或直接在堆栈上)。因为它不是对象,所以不能引用它。尝试以下内容:
select v from Vector v where v.x == 1.0 || v.y == 1.0 || v.z == 1.0
如果要检查所有对象中的所有浮点字段, 可以使用OQL的反射功能来执行此操作,使用以下内容:
select filter(heap.objects(), function(it) {
var cls = classof(it);
while (cls) {
for (var i = 0; i < cls.fields.length; i++) {
var field = cls.fields[i];
if (field.signature == 'F' && it[field.name] == 0.0)
return true;
}
cls = cls.superclass;
}
return false;
})
然而,虽然这可以正常使用jhat,但它在我的VisualVM版本(1.6.0_22)中不起作用,因为cls.fields似乎不正确地返回静态字段列表而不是实例字段。
它也很慢,需要10秒才能搜索1MB堆转储。通过仅搜索有限的一组类,可能可以优化代码并加快速度。