Использование Jhat кучи встроенного объекта
Кто-нибудь может показать пример использования heap.heapForEachClass в операторе выбора? Было бы замечательно, если бы вы могли предоставить некоторые ссылки с различными примерами запросов (кроме тех, что на странице oqlhelp, конечно:))
2 ответа
Я не верю, что heap.forEachClass() предназначен для использования в операторе выбора, по крайней мере, не напрямую. Учтите тот факт, что он ничего не возвращает:
var result=heap.forEachClass(function(it){return it;});
typeof result
//returns undefined
OQL, используемый в jhat и VisualVM, поддерживает обычный старый JavaScript, так же как и "запрос", который я использую выше. Я считаю, что heap.forEachClass() находит более широкое применение либо в запросах в стиле JavaScript, либо в функциях JavaScript внутри запросов типа select.
Тем не менее, я не знаю, почему эта функция существует, поскольку перечисление heap.classes() намного проще в использовании, как с запросами в стиле select, так и с простыми JavaScript-запросами.
Вы даже можете воссоздать ту же функциональность, что и heap.forEachClass(), с помощью следующей функции JavaScript:
function heapForEachClass(func){
map(heap.classes(),func)
return undefined;
}
Любые примеры запросов, которые я мог бы вам предоставить, скорее всего, будут проще писать с помощью heap.classes(). Например, вы можете использовать heap.forEachClass(), чтобы получить список всех классов:
var list=[];
heap.forEachClass(function(it){
list.push(it);
});
list
но это сложнее, чем с помощью heap.classes():
select heap.classes()
или просто
heap.classes()
Я использовал эту функцию прежде, чтобы искать классы, которые загружаются несколько раз (обычно это происходит, когда два разных загрузчика классов загружают одну и ту же библиотеку без особой причины, и при этом объекты сериализации и десериализации JVM передаются из одного экземпляра класса к другому, потому что он не знает, что они на самом деле одного и того же класса-)
Это мой OQL-скрипт, который выбирает (и считает) классы с одинаковыми именами:
var classes = {};
var multipleLoadedClasses = {};
heap.forEachClass(function(it) {
if (classes[it.name] != null) {
if (multipleLoadedClasses[it.name] != null) {
multipleLoadedClasses[it.name] = multipleLoadedClasses[it.name] + 1;
} else {
multipleLoadedClasses[it.name] = 1;
}
} else {
classes[it.name] = it;
}
});
multipleLoadedClasses;
надеется, что это поможет дальнейшим посетителям;)