VisualVM OQL:如何搜索原始浮点值而不是实际的浮点数实例?

我想知道如何搜索匹配特定数字的所有原始浮点值。

在做类似的事情时:

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 

原始值仅作为结构中的字段存在(或直接在堆栈上)。 因为它不是对象,所以不能引用它。 尝试以下内容:

 select v from Vector v where vx == 1.0 || vy == 1.0 || vz == 1.0 

如果要检查所有对象中的所有浮点字段, 应该可以使用OQL的reflectionfunction来执行此操作,使用以下内容:

 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堆转储。 通过仅搜索有限的一组类,可以优化代码并加快速度。