Использование 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;

надеется, что это поможет дальнейшим посетителям;)

Другие вопросы по тегам