Как я могу получить имя класса из 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.