2016-03-17 4 views
0

Я пытаюсь получить имя класса из 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<> инициализации

ответ

3

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

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

...

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

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

This answer объясняет, как отслеживать объект распределения в Java.

 Смежные вопросы

  • Нет связанных вопросов^_^