如何从jvmti中的jobject获取类名

时间:2016-03-17 19:51:00

标签: java jvm jvmti

我试图从jvmti中的jobject获取类名,我试着

(*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 个答案:

答案 0 :(得分:3)

我想您正在尝试VMObjectAlloc JVMTI通知。对于在Java代码中进行的分配,不会发送此通知。 JVMTI规范中描述了此行为:

  

发送时...其他入侵机制无法检测到分配。一般来说,对象分配应该通过检测来检测   分配方法的字节码。

     

...

     

不会生成此事件的情况:

     
      
  • 由字节码引起的分配 - 例如,新的和新的阵列VM指令
  •   
  • 由于JNI函数调用而导致的分配 - 例如,AllocObject
  •   
  • VM初始化期间的分配
  •   
  • VM内部对象
  •   

This answer解释了如何在Java中跟踪对象分配。