jvmtiError RetainedSizesAction::calculateRetainedSizes()

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