Использование Jhat кучи встроенного объекта - PullRequest
1 голос
/ 10 июня 2011

Кто-нибудь может показать пример использования heap.heapForEachClass в операторе select? Было бы замечательно, если бы вы могли предоставить некоторые ссылки с разными примерами запросов (кроме тех, которые на странице oqlhelp, конечно :))

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

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

var result=heap.forEachClass(function(it){return it;});
typeof result
//returns undefined

OQL, используемый в jhat и VisualVM, поддерживает обычный старый JavaScript, так же как и «запрос», который я использовал выше.Я считаю, что heap.forEachClass () находит более широкое применение в запросах в стиле JavaScript или в функциях JavaScript в запросах типа select.

Тем не менее, я не знаю, почему эта функция существует со времен кучи.Перечисление 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()
1 голос
/ 21 февраля 2018

Я использовал эту функцию прежде, чтобы искать классы, которые загружаются несколько раз (обычно это происходит, когда два разных загрузчика классов загружают одну и ту же библиотеку без всякой причины, и заставляют 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;

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

...