in src/sizes/retained_size_action.cpp [34:57]
jint JNICALL getTagsWithNewInfo(jvmtiHeapReferenceKind refKind, const jvmtiHeapReferenceInfo *refInfo, jlong classTag,
jlong referrerClassTag, jlong size, jlong *tagPtr,
jlong *referrerTagPtr, jint length, void *userData) {
if (refKind == JVMTI_HEAP_REFERENCE_JNI_LOCAL || refKind == JVMTI_HEAP_REFERENCE_JNI_GLOBAL ||
isTagWithNewInfo(*tagPtr) || handleReferrersWithNoInfo(referrerTagPtr, tagPtr, true)) {
return JVMTI_VISIT_OBJECTS;
}
Tag *referrer = tagToPointer(*referrerTagPtr);
Tag *referree = tagToPointer(*tagPtr);
if (*tagPtr == 0) {
*tagPtr = pointerToTag(referrer->share());
} else if (tagsAreValidForMerge(*tagPtr, *referrerTagPtr)) {
if (referree->alreadyReferred) {
referree->unref();
*tagPtr = pointerToTag(&Tag::TagWithNewInfo);
} else {
*tagPtr = pointerToTag(merge(*tagPtr, *referrerTagPtr));
}
}
referrer->alreadyReferred = true;
return JVMTI_VISIT_OBJECTS;
}