HotSpot Serviceability Agent的iterateObjectsOfKlass()太慢了

Mat*_* Ho 1 java heap performance jvm jvm-hotspot

我能够ObjectHeap.iterateObjectsOfKlass(在SA的帮助下)调用以获取属于某个类的所有对象.结果正是我所期望的,但性能却不是.

我花了800秒才得到我的结果,在此期间目标虚拟机被暂停.目标VM堆大约为2GB.我知道iterateObjectsOfKlass会打电话iterateExact.

我的问题是:这些方法迭代/遍历整个堆只是为了获得1个类的对象吗?我很失望,因为我的期望是单一课程,结果应该在10秒内返回.

apa*_*gin 6

HotSpot Serviceability Agent是非常强大的技术,但确实非常慢.我在这个答案中解释了它是如何工作的.

JVM无法快速查找特定类的所有实例.所以,是的,它必须扫描整个堆.此外,为了读取外来进程的存储器,SA ptrace对每个单词数据使用系统调用.这就是它如此缓慢的原因.

您有几种选择来更快地扫描堆:

  1. 创建外部进程的coredump,然后针对coredump运行SA工具.这比读取暂停进程的内存要快得多.查看相关问题.
  2. 注入JVMTI剂引入使用运行的进程动态连接机构.代理可以使用IterateOverInstancesOfClass函数扫描本地JVM的堆.与SA相比,这将大大加快,因为它只是在同一个进程中读取而没有任何系统调用或其他任何内容.我相信2GB堆只需要几秒钟.