【问题标题】:how do I get class name from jobject in jvmti如何从 jvmti 中的 jobject 获取类名
【发布时间】:2016-03-17 19:50:59
【问题描述】:

我正在尝试从 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&lt;&gt;初始化

【问题讨论】:

    标签: java jvm jvmti


    【解决方案1】:

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

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

    ...

    不会产生此事件的情况:

    • 由于字节码分配 - 例如,new 和 newarray VM 指令
    • 由于 JNI 函数调用而分配 - 例如,AllocObject
    • VM 初始化期间的分配
    • VM 内部对象

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-25
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多