Как я могу получить имя класса из jobject в jvmti

Я пытаюсь получить имя класса из jobject в jvmti, я пытался получить

(*jvmti)->GetClassSignature(jvmti, object_klass, &signature, &generic);

для такого кода

public static void main(String arg[]) throws Exception {
    Set<String> names = new HashSet<>();
    names.add("foo");
    names.add("bar");
    System.out.println(names);
}

Я отслеживаю все распределение объектов в jvmti, я не получаю java.util.HashSet в этом крючке

Я получаю кучу

Ljava/lang/String;     Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/Comparable<Ljava/lang/String;>;Ljava/lang/CharSequence;
Ljava/lang/reflect/Method; (null)

и некоторые другие классы, но я не вижу new HashSet<> инициализация

1 ответ

Я полагаю, вы пытаетесь уведомить VMObjectAlloc JVMTI. Это уведомление не отправляется для распределений, сделанных в коде Java. Это поведение описано в спецификации JVMTI:

Отправляется, когда... распределение не обнаруживается другими механизмами интрументации. Как правило, распределение объектов должно быть обнаружено с помощью байт-кодов методов распределения.

...

Случаи, когда это событие не будет сгенерировано:

  • Распределение по байт-кодам - ​​например, инструкции new и newarray VM
  • Распределение из-за вызовов функции JNI - например, AllocObject
  • Распределения во время инициализации ВМ
  • ВМ внутренние объекты

Этот ответ объясняет, как отслеживать размещение объектов в Java.

Другие вопросы по тегам