オブジェクトから間接参照への最初のパスを見つけようとしています。
次のコードは、私が思いついたものです。
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 を VisualVM の OQL クエリ ウィンドウ内で実行します。
これは、referrerObj のすべてのレフリーを 1 つずつ最大の深さまで通過することになっています。ターゲットがまだ見つからない場合は、次のレフリー レベルを調べる必要があります。
ただし、何らかの理由で、渡された最初のリファラーの最初の直接被参照者の可能なパスをたどった後、コードは実行を停止するようです。
2 番目の while ループが完了していないように見えます。エラーコードは表示されませんが、何も返されません。
なぜこれが起こるのか、誰にも手がかりがありますか? 他の誰かが VisualVM でこれを実行し、その結果を報告できれば、それは素晴らしいことです。
ありがとう。