2

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

当做类似的事情时:

select n from java.lang.Float n where n.value == 1.00

仅找到 Float 类实例。我正在探索的应用程序使用不同的包装器,而不仅仅是使用原始浮点值作为我需要搜索的字段的浮点数(例如向量)。

我将如何做到这一点?

以下返回“未找到浮点错误”:

select n from float n where n.value == 1.00
4

1 回答 1

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 似乎不正确地返回静态字段列表而不是实例字段。

它也很慢,搜索一个 1MB 的堆转储需要 10 秒。通过仅搜索一组有限的类,可能可以优化代码并加快速度。

于 2011-02-16T21:01:19.413 回答