При профилировании с использованием асинхронного профилировщика и gperftools я заметил, что jvmti->GetTag
довольно много показывает в результатах для моего агента. Когда я проверил, как это реализовано, я обнаружил в источнике jvmitTagMap.cpp
следующее:
jlong JvmtiTagMap::get_tag(jobject object) {
MutexLocker ml(lock());
// resolve the object
oop o = JNIHandles::resolve_non_null(object);
// for Classes get the tag from the klassOop
return tag_for(this, klassOop_if_java_lang_Class(o));
}
- Хотя в моем тесте был только один поток, который был действительно загружен, кажется, что он будет масштабироваться еще меньше, когда я добавлю больше потоков и интенсивно использую
GetTag
.
Я хотел использовать тег, чтобы назначить идентификатор для определенных объектов и использовать его в моем агенте jvmti. Любые идеи для более быстрого способа сделать это? Возиться с заголовком объекта obvioulsy не вариант (насколько я знаю).
ПРИМЕЧАНИЕ. Большинство вещей следует выполнять на стороне C, поскольку я не хочу, чтобы мой агент Java каким-либо образом вмешивался в приложение. Под вмешательством я имею в виду такие вещи, как изменение внутреннего состояния некоторых центральных объектов / классов (например, java.lang.StringCoding
) или ведение к загрузке некоторых классов и т. Д.
GetTag
уже активно используется в текущем агенте JVMTI, поэтому я ищу более быстрый способ получить тег или реализовать свой собственный механизм, оставаясь на стороне C.