比JVMTI GetTag

时间:2018-11-14 23:10:16

标签: java performance jvm jvm-hotspot jvmti

在使用异步事件探查器和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));
}
  1. 尽管我的测试中只有一个真正处于负载状态的线程,但看来,一旦我添加更多线程并大量使用GetTag,此线程的扩展规模甚至会减少。

我想使用标签将ID分配给某些对象,并在我的jvmti代理中使用它。有什么更快的想法可以实现吗?据我所知,使用对象标头来避免麻烦是不可行的。

注意:大多数事情应该在C端完成,因为我不希望Java代理以任何方式干扰应用程序。通过干涉,我什至指的是诸如更改某些中央对象/类(例如,java.lang.StringCoding)的内部状态,或导致某些类被加载等

GetTag已经在当前的JVMTI代理中大量使用,因此我正在寻找一种更快的方法来获取标记或实现我自己的机制,同时又站在C端。

1 个答案:

答案 0 :(得分:0)

在使用C语言中的Java对象时,您基本上会受到JNI和JVMTI函数的限制。而且它们确实有不可避免的开销。

恐怕没有其他合法方法可以从本地代理访问Java对象。特别是,处理裸露的循环是非法的-这只是一个原始指针,由于对象可以移动,它随时可能无效。

但是,

JVM可以使用oop,甚至可以将对象地址用作JvmtiTagMap中的键,只要它在移动对象时更新相应的oop。而HotSpot JVM确实做到了,请参见JvmtiTagMap::do_weak_oops