在使用异步事件探查器和gperftools进行性能分析时,我注意到jvmti->GetTag
在我的代理的结果中显示了很多。当我检查其实现方式时,在jvmitTagMap.cpp
的源代码中发现了以下内容:
jlong JvmtiTagMap::get_tag(jobject object) {
MutexLocker ml(lock());
// resolve the object
oop o = JNIHandles::resolve_non_null(object);
// for Classes get the tag from the klassOop
return tag_for(this, klassOop_if_java_lang_Class(o));
}
GetTag
,此线程的扩展规模甚至会减少。 我想使用标签将ID分配给某些对象,并在我的jvmti代理中使用它。有什么更快的想法可以实现吗?据我所知,使用对象标头来避免麻烦是不可行的。
注意:大多数事情应该在C端完成,因为我不希望Java代理以任何方式干扰应用程序。通过干涉,我什至指的是诸如更改某些中央对象/类(例如,java.lang.StringCoding
)的内部状态,或导致某些类被加载等
GetTag
已经在当前的JVMTI代理中大量使用,因此我正在寻找一种更快的方法来获取标记或实现我自己的机制,同时又站在C端。
答案 0 :(得分:0)
在使用C语言中的Java对象时,您基本上会受到JNI和JVMTI函数的限制。而且它们确实有不可避免的开销。
恐怕没有其他合法方法可以从本地代理访问Java对象。特别是,处理裸露的循环是非法的-这只是一个原始指针,由于对象可以移动,它随时可能无效。
但是, JVM可以使用oop,甚至可以将对象地址用作JvmtiTagMap
中的键,只要它在移动对象时更新相应的oop。而HotSpot JVM确实做到了,请参见JvmtiTagMap::do_weak_oops。