使用OQL / VisualVM进行Java堆分析:查找从间接引荐者到裁判的路径?

时间:2011-02-20 19:24:51

标签: java heap visualvm oql

我正在尝试找到从对象到某个间接引用的第一条路径。

以下代码是我提出的:

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中运行它并报告他/她的发现,那就太好了。

感谢。

0 个答案:

没有答案