【问题标题】:VisualVM OQL: how to search for primitive float values rather than actual Float instances?VisualVM OQL:如何搜索原始浮点值而不是实际的浮点实例?
【发布时间】:2011-02-16 20:56:02
【问题描述】:

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

当做类似的事情时:

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

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

我将如何做到这一点?

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

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

【问题讨论】:

    标签: java primitive visualvm oql


    【解决方案1】:

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

    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 秒。通过仅搜索有限的类集,可能可以优化代码并加快处理速度。

    【讨论】:

    • 这里的问题是我不知道哪些类使用它。有没有办法搜索原始浮点数的所有类和所有字段?
    • 这种方法正是我所需要的。不幸的是我不能让它工作,我认为你的代码有一些问题。我正在尝试解决它,但到目前为止还没有运气。当我得到它的工作时会接受你的回答。为什么要获取对象的类?这可能就是它只返回静态字段(对象具有非静态字段)的原因。
    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多