2

我试图找到从一个对象到某个间接推荐人的第一条路径。

以下代码是我想出的:

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;
}

我在 VisualVM 的 OQL 查询窗口中运行这段 Javascript。

它应该一个一个地遍历referrerObj的所有裁判,直到最大深度,如果还没有找到目标,它应该寻找下一个裁判级别。

然而,由于某种原因,代码似乎在遵循初始推荐人的第一个直接推荐人的可能路径后停止执行。

看起来第二个 while 循环永远不会完成。我没有收到任何错误代码,只是没有返回任何内容。

有谁知道为什么会发生这种情况?如果其他人可以在 VisualVM 中运行它并报告他/她的发现,那就太好了。

谢谢。

4

0 回答 0