我试图从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<>
初始化
答案 0 :(得分:3)
我想您正在尝试VMObjectAlloc JVMTI通知。对于在Java代码中进行的分配,不会发送此通知。 JVMTI规范中描述了此行为:
发送时...其他入侵机制无法检测到分配。一般来说,对象分配应该通过检测来检测 分配方法的字节码。
...
不会生成此事件的情况:
- 由字节码引起的分配 - 例如,新的和新的阵列VM指令
- 由于JNI函数调用而导致的分配 - 例如,AllocObject
- VM初始化期间的分配
- VM内部对象
This answer解释了如何在Java中跟踪对象分配。