Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java VisualVM OQL:如何搜索基本浮点值而不是实际浮点实例?_Java_Primitive_Visualvm_Oql - Fatal编程技术网

Java VisualVM OQL:如何搜索基本浮点值而不是实际浮点实例?

Java VisualVM OQL:如何搜索基本浮点值而不是实际浮点实例?,java,primitive,visualvm,oql,Java,Primitive,Visualvm,Oql,我想知道如何搜索与某个数字匹配的所有基本浮点值 在执行以下操作时: select n from java.lang.Float n where n.value == 1.00 只找到Float类实例。我正在探索的应用程序使用不同的包装器,而不仅仅是使用基本浮点值作为我需要搜索的字段的浮点(例如向量) 我将如何做到这一点 以下返回“未找到浮点”错误: 基元值仅作为其所属结构(或直接在堆栈上)中的字段存在。因为它不是对象,所以不能被引用。请尝试以下操作: select v from Vector

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

在执行以下操作时:

select n from java.lang.Float n where n.value == 1.00
只找到Float类实例。我正在探索的应用程序使用不同的包装器,而不仅仅是使用基本浮点值作为我需要搜索的字段的浮点(例如向量)

我将如何做到这一点

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


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

select v from Vector v where v.x == 1.0 || v.y == 1.0 || v.z == 1.0
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;
})

如果要检查所有对象中的所有浮点字段,则可以使用OQL的反射功能来检查,方法如下所示:

select v from Vector v where v.x == 1.0 || v.y == 1.0 || v.z == 1.0
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;
})
选择过滤器(heap.objects(),函数(it){
var cls=类别(it);
while(cls){
对于(变量i=0;i
但是,尽管使用jhat可以正确地执行此操作,但在我的VisualVM版本(1.6.0_22)中它不起作用,因为cls.fields似乎不正确地返回静态字段列表,而不是实例字段


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

这里的问题是我不知道哪些类使用它。难道没有办法搜索所有基本浮动的类和字段吗?这种方法正是我所需要的。不幸的是,我不能让它工作,虽然,我认为你的代码有一些问题。我正在努力解决这个问题,但到目前为止运气不好。我会接受你的答案当我得到它的工作。为什么要得到对象的类?这可能就是为什么它只返回静态字段(对象具有非静态字段)。