VisualVM OQL: как искать примитивные значения с плавающей точкой, а не фактические экземпляры с плавающей точкой? - PullRequest
2 голосов
/ 16 февраля 2011

Мне интересно, как можно искать все примитивные значения с плавающей запятой, которые соответствуют определенному числу.

Когда вы делаете что-то вроде:

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

Обнаружены только экземпляры класса Float.Приложение, которое я изучаю, использует другие обертки, чем просто Float (например, Векторы), которые используют примитивные значения с плавающей точкой в ​​качестве полей, по которым мне нужно искать.

Как бы мне этого добиться?

следующее возвращает «ошибка с плавающей точкой не найдена»:

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

1 Ответ

3 голосов
/ 17 февраля 2011

Примитивное значение существует только как поле в структуре, частью которой оно является (или непосредственно в стеке).Поскольку это не объект, на него нельзя ссылаться.Попробуйте что-то вроде следующего:

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, похоже, неправильно возвращает списокстатические поля, а не поля экземпляров.

Это также очень медленно, занимает 10 секунд для поиска дампа кучи 1 МБ.Возможно, возможно оптимизировать код, а также ускорить процесс, выполнив поиск только в ограниченном наборе классов.

...