Более быстрая альтернатива для получения тегов для объектов, чем JVMTI GetTag - PullRequest
0 голосов
/ 15 ноября 2018

При профилировании с использованием асинхронного профилировщика и 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));
}
  1. Хотя в моем тесте был только один поток, который был действительно загружен, кажется, что он будет масштабироваться еще меньше, когда я добавлю больше потоков и интенсивно использую GetTag.

Я хотел использовать тег, чтобы назначить идентификатор для определенных объектов и использовать его в моем агенте jvmti. Любые идеи для более быстрого способа сделать это? Возиться с заголовком объекта obvioulsy не вариант (насколько я знаю).

ПРИМЕЧАНИЕ. Большинство вещей следует выполнять на стороне C, поскольку я не хочу, чтобы мой агент Java каким-либо образом вмешивался в приложение. Под вмешательством я имею в виду такие вещи, как изменение внутреннего состояния некоторых центральных объектов / классов (например, java.lang.StringCoding) или ведение к загрузке некоторых классов и т. Д.

GetTag уже активно используется в текущем агенте JVMTI, поэтому я ищу более быстрый способ получить тег или реализовать свой собственный механизм, оставаясь на стороне C.

1 Ответ

0 голосов
/ 16 ноября 2018

Когда вы работаете с объектами Java из C, вы в основном ограничены функциями JNI и JVMTI. И у них есть неизбежные накладные расходы.

Боюсь, что нет никаких других законных способов доступа к объектам Java из нативного агента. В частности, недопустимо иметь дело с «пустым» - это просто необработанный указатель, который может стать недействительным в любой момент, потому что объекты могут двигаться.

JVM, однако, может работать с опциями и даже использовать адрес объекта в качестве ключа в JvmtiTagMap, если он обновляет соответствующие операции при каждом перемещении объектов. И HotSpot JVM действительно делает это, см. JvmtiTagMap :: do_weak_oops .

...