java - VisualVM OQL : how to search for primitive float values rather than actual Float instances?

标签 java primitive visualvm oql

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

当做类似的事情时:

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

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

我该如何实现这个目标?

以下内容返回“找不到 float 错误”:

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

最佳答案

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

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

关于java - VisualVM OQL : how to search for primitive float values rather than actual Float instances?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5021988/

相关文章:

java - 执行任何操作后如何重置多维列表(国际象棋中的 Noob Java 编码)?

java - 如何强制 JavaFX 应用程序中的所有按钮使用我的自定义皮肤?

java - 将 visualvm 连接到 websphere 7

java - 充满反射调用的常规应用程序的 CPU 分析器结果

java - 需要逻辑解释java反向字符串

java - 删除两个特定标签之间的所有字符(java regex)

java - 在Java中发现驱动类中没有参数

performance - 原始类型 HashSet 或 HashMap 比 Object 快 10 倍?

java - 拆箱如何在短路 boolean 表达式中工作?

java - 为什么这种方法成为热点?