in src/sizes/retained_size_action.cpp [127:157]
jvmtiError walkHeapFromObjects(jvmtiEnv *jvmti,
const std::vector<jobject> &objects,
const CancellationChecker &cancellationChecker) {
jvmtiError err = JVMTI_ERROR_NONE;
if (!objects.empty()) {
jvmtiHeapCallbacks cb;
std::memset(&cb, 0, sizeof(jvmtiHeapCallbacks));
cb.heap_reference_callback = reinterpret_cast<jvmtiHeapReferenceCallback>(&spreadInfo);
int heapWalksCnt = 0;
for (auto &object : objects) {
if (cancellationChecker.shouldStopExecution()) {
return MEMORY_AGENT_INTERRUPTED_ERROR;
}
jlong tag;
err = jvmti->GetTag(object, &tag);
if (err != JVMTI_ERROR_NONE) return err;
if (tagsWithNewInfo.find(tag) != tagsWithNewInfo.end()) {
tagsWithNewInfo.erase(tag);
err = jvmti->FollowReferences(0, nullptr, object, &cb, nullptr);
if (err != JVMTI_ERROR_NONE) return err;
logger::debug(std::to_string(tagsWithNewInfo.size()).c_str());
heapWalksCnt++;
}
}
logger::debug(std::string("Total heap walks: " + std::to_string(heapWalksCnt)).c_str());
}
return err;
}