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