in src/roots/paths_to_closest_gc_roots.cpp [291:317]
void setTagsForReferences(JNIEnv *env, jvmtiEnv *jvmti, jlong tag) {
const char *refClassesNames[3] = {
"java/lang/ref/SoftReference",
"java/lang/ref/WeakReference",
"java/lang/ref/PhantomReference"
};
jclass refClasses[3];
for (int i = 0; i < 3; i++) {
refClasses[i] = env->FindClass(refClassesNames[i]);
}
jclass *classes;
jint cnt;
jvmtiError err = jvmti->GetLoadedClasses(&cnt, &classes);
handleError(jvmti, err, "Couldn't get loaded classes");
jmethodID isAssignableFrom = getIsAssignableFromMethod(env);
for (int i = 0; i < cnt; i++) {
for (auto & refClass : refClasses) {
if (env->CallBooleanMethod(refClass, isAssignableFrom, classes[i])) {
err = jvmti->SetTag(classes[i], tag);
handleError(jvmti, err, "Couldn't set tag for reference class");
break;
}
}
}
}