System
和Unsafe
都提供了一些重叠的功能(例如,System.arraycopy
与_UNSAFE.copyMemory
)。
在实现方面,看起来两者都依赖于jni
,这是正确的说法吗?(我可以找到unsafe.cpp,但在JVM源代码中找不到相应的arraycopy
实现)。
另外,如果两者都依赖于JNI,我能说两者的调用开销是相似的吗?
我知道Unsafe
可以操纵offheap
内存,但为了进行比较,我们在这里将上下文限制在onheap
内存上。
谢谢你的回答。
1条答案
按热度按时间vmdwslir1#
System.arraycopy
和Unsafe.copyMemory
都是HotSpot内部函数。这意味着,JVM在从JIT编译的方法调用这些方法时不使用JNI实现。相反,它会用特定于体系结构的优化汇编代码来替换调用。您可以在
stubGenerator_<arch>.cpp
中找到源代码。下面是一个简单的JMH基准测试:
这证实了两种方法的性能相似:
如果您使用
-prof perfasm
分析器运行此JMH基准测试,您将看到这两种方法都归结为完全相同的汇编循环:在Java堆中处理正则数组时,完全不需要使用Unsafe API,标准的
System.arraycopy
已经做了很好的优化,JDK类库本身几乎到处都使用System.arraycopy
,包括StringBuilder
、ArrayList
、ByteArrayOutputStream
等。