Анализ кучи Java с помощью OQL / VisualVM: найти путь от косвенного реферера до рефери? - PullRequest
2 голосов
/ 20 февраля 2011

Я пытаюсь найти первый найденный путь от объекта к некоторому косвенному рефери.

Следующий код - это то, что я придумал:

var debug = [];

//set referrer and target
var referrerObj = heap.findObject("815262352");
var targetObj = heap.findObject("815441600");

//prepare refer obj
var pathToTarget = getShortestReferPath([referrerObj], targetObj, 6);
[allocTrace(pathToTarget), debug];

//sets the shortest reference path from referrer to target
function getShortestReferPath(referPath, targetObj, maxDepth, depth) {
    depth = (typeof(depth) != "undefined") ? depth : 1;

    //get the last referrer for further processing
    var lastReferrer = referPath[referPath.length-1];

    //check every referee of the referrer
    var dirReferees = referees(lastReferrer);
    while (dirReferees.hasMoreElements()) {
        var dirReferee = dirReferees.nextElement();

        //if this referee is our target, set the path and return
        if (identical(dirReferee, targetObj)) {
            referPath.push(dirReferee);
            return referPath;
        }
    }

    //none of these is our target, so check the next depth if it is not too high
    if (depth < maxDepth) {
        var dirRefereesTwo = referees(lastReferrer);
        while (dirRefereesTwo.hasMoreElements()) {
            var dirRefereeTwo = dirRefereesTwo.nextElement();

            //set this referee as our last item
            var newReferPath = referPath.slice();
            newReferPath.push(dirRefereeTwo);
            var referPathTest = getShortestReferPath(newReferPath, targetObj, maxDepth, depth + 1);
            if (referPathTest != null) return referPathTest;
        }
    }

    //return the current path
    return null;
}

Я запускаю этот бит Javascript в окне запросов VisualQL VQL.

Предполагается, что все судьи referrerObj проходят один за другим до максимальной глубины, на которой он должен смотреть на следующий уровень судей, если цель еще не найдена.

Однако по какой-то причине код, по-видимому, останавливается после выполнения возможных путей первого прямого рефери исходного пройденного реферера.

Похоже, что второй цикл while никогда не завершается. Я не получаю код ошибки, просто я ничего не возвращаю.

Кто-нибудь знает, почему это может произойти? Если бы кто-то еще мог запустить это в VisualVM и сообщить о своих выводах, это было бы здорово.

Спасибо.

...