Java 什么是StubRoutines::jbyte\u disjoint\u arraycopy

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

我正在测量一些单线程方法调用(用Scala编写),并希望分析基准测试。下面是它的样子(省略了实现细节)

好的,我得到了一些结果,并想了解它,但是
-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");