in src/sizes/retained_size_via_dominator_tree.cpp [139:166]
jvmtiError RetainedSizesAction<RESULT_TYPE, ARGS_TYPES...>::calculateRetainedSizes(jobjectArray objects,
std::vector<jlong> &retainedSizes,
SizesViaDominatorTreeHeapDumpInfo &info) {
jvmtiError err = info.initAndSetTagsForObjects(this->env, this->jvmti, objects);
if (!isOk(err)) return err;
// We set a tag for the input array to ignore it during traversal
err = this->jvmti->SetTag(objects, MOCK_REFERRER_TAG);
if (!isOk(err)) return err;
this->progressManager.updateProgress(10, "Traversing heap for the first time...");
logger::resetTimer();
err = this->FollowReferences(0, nullptr, nullptr, firstTraversal, &info);
logger::logPassedTime();
if (!isOk(err) || this->shouldStopExecution()) return err;
logger::resetTimer();
this->progressManager.updateProgress(60, "Traversing heap for the second time...");
err = this->FollowReferences(0, nullptr, objects, secondTraversal, &info);
logger::logPassedTime();
if (!isOk(err) || this->shouldStopExecution()) return err;
this->progressManager.updateProgress(80, "Calculating retained size...");
info.setUpNeighboursForMasterNode();
retainedSizes = calculateRetainedSizesViaDominatorTree(info.graph, info.sizes);
return err;
}