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

时间:2011-02-16 20:56:02

标签: java primitive 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

1 个答案:

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