Java 什么是StubRoutines::jbyte\u disjoint\u arraycopy
我正在测量一些单线程方法调用(用Scala编写),并希望分析基准测试。下面是它的样子(省略了实现细节) 好的,我得到了一些结果,并想了解它,但是Java 什么是StubRoutines::jbyte\u disjoint\u arraycopy,java,jvm,jmh,Java,Jvm,Jmh,我正在测量一些单线程方法调用(用Scala编写),并希望分析基准测试。下面是它的样子(省略了实现细节) 好的,我得到了一些结果,并想了解它,但是-prof perfasm的输出对我来说有点不清楚。首先: ....[Hottest Regions]............................................................................... 44.20% 40.50% runtime stub StubRouti
-prof perfasm
的输出对我来说有点不清楚。首先:
....[Hottest Regions]...............................................................................
44.20% 40.50% runtime stub StubRoutines::jbyte_disjoint_arraycopy (205 bytes)
6.78% 1.62% C2, level 4 cats.data.IndexedStateT$$Lambda$21::apply, version 1242 (967 bytes)
4.39% 0.79% C2, level 4 my.pack.age.Mclass::cut0, version 1323 (299 bytes)
及
我找到了一些关于jbyte\u disjoint\u arraycopy
。声明如下
StubRoutines::_jbyte_disjoint_arraycopy = generate_disjoint_byte_copy(false, &entry,
"jbyte_disjoint_arraycopy");
从generate\u disjoint\u byte\u copy
方法的来源来看,它看起来像是一个汇编代码生成的东西。。。我可以猜到这是x86
的一些内在数组拷贝
问题:你能解释一下最热的地区吗?你猜对了\u disjoint\u arraycopy
存根是在运行时生成的函数,专门用于加速系统.arraycopy
调用
当JVM启动时,它使用当前可用的代码为某些例程生成优化的机器代码。例如,如果CPU支持AVX2,则生成的arraycopy
存根将被删除
System.arraycopy
是一种内部方法。由C2编译时,调用System.arraycopy
执行必要的检查,然后调用生成的arraycopy
存根例程之一
如果StubRoutines::jbyte\u disjoint\u arraycopy
是最热门的区域,则基本上意味着您的基准测试将大部分时间花在系统中。arraycopy
处理字节[]
数组。您可以尝试查看从何处调用此arraycopy
。您猜对了\u disjoint\u arraycopy
存根是在运行时生成的函数,专门用于加速系统.arraycopy
调用
当JVM启动时,它使用当前可用的代码为某些例程生成优化的机器代码。例如,如果CPU支持AVX2,则生成的arraycopy
存根将被删除
System.arraycopy
是一种内部方法。由C2编译时,调用System.arraycopy
执行必要的检查,然后调用生成的arraycopy
存根例程之一
如果StubRoutines::jbyte\u disjoint\u arraycopy
是最热门的区域,则基本上意味着您的基准测试将大部分时间花在系统中。arraycopy
处理字节[]
数组。您可以尝试查看从何处调用此arraycopy
。它起作用了
你猜对了_不相交的_arraycopy存根是在运行时生成的函数,专门用于加速System.arraycopy调用
当JVM启动时,它使用当前可用的CPU特性为某些例程生成优化的机器代码。例如,如果CPU支持AVX2,生成的arraycopy存根将使用AVX2指令
System.arraycopy是一种新的方法。由C2编译时,对System.arraycopy的调用将执行必要的检查,然后调用生成的arraycopy存根例程之一
如果StubRoutines::jbyte\u disjoint\u arraycopy是最热门的区域,则基本上意味着您的基准测试将大部分时间花在System.arraycopy内部处理byte[]数组。您可以尝试使用异步探查器查看从何处调用此arraycopy。它起作用了
你猜对了_不相交的_arraycopy存根是在运行时生成的函数,专门用于加速System.arraycopy调用
当JVM启动时,它使用当前可用的CPU特性为某些例程生成优化的机器代码。例如,如果CPU支持AVX2,生成的arraycopy存根将使用AVX2指令
System.arraycopy是一种新的方法。由C2编译时,对System.arraycopy的调用将执行必要的检查,然后调用生成的arraycopy存根例程之一
如果StubRoutines::jbyte\u disjoint\u arraycopy是最热门的区域,则基本上意味着您的基准测试将大部分时间花在System.arraycopy内部处理byte[]数组。您可以尝试使用async profiler查看从何处调用此arraycopy。我在这里看到两个不同的问题:1)存根例程是什么,它是如何工作的。2) 热点反汇编程序有什么问题。不确定该回答哪一个-请在每篇文章中问一个问题。@apangin不相关的部分被删除。我在这里看到两个不同的问题:1)存根例程是什么,它是如何工作的。2) 热点反汇编程序有什么问题。不确定要回答哪一个问题-请在每篇文章中问一个问题。@apangin不相关的部分已删除。您能了解如何执行此功能检查吗?我查看了generate\u disjoint\u byte\u copy
,没有注意到使用了任何与AVX2相关的指令/寄存器。也许它在另一个地方…?@St.Antario用VM\u Version::get\u processor\u features()
和AVX2用法的链接更新了答案。现在我明白了。非常感谢。您能了解一下如何执行此功能检查吗?我查看了generate\u disjoint\u byte\u copy
,没有注意到使用了任何与AVX2相关的指令/寄存器。也许它在另一个地方…?@St.Antario用VM\u Version::get\u processor\u features()
和AVX2用法的链接更新了答案。现在我明白了。多谢。
....[Hottest Methods (after inlining)]..............................................................
44.20% 40.50% runtime stub StubRoutines::jbyte_disjoint_arraycopy
8.40% 3.93% C2, level 4 cats.data.IndexedStateT$$Lambda$21::apply, version 1242
5.76% 2.67% C2, level 4 my.pack.age.Mclass::cut0, version 1323
StubRoutines::_jbyte_disjoint_arraycopy = generate_disjoint_byte_copy(false, &entry,
"jbyte_disjoint_arraycopy");