system.arraycopy高性能本质是jvm绕过字节码,直接调用c级内存函数批量搬运;仅一次参数校验后以连续内存块为单位物理复制,支持基本类型字节拷贝、引用类型地址拷贝及重叠安全语义。

System.arraycopy实现高性能数组复制的本质,是绕过Java字节码解释执行路径,直接由JVM调用底层C/C++级内存操作函数(如memmove或memcpy),以连续内存块为单位进行物理搬运。
它不走Java循环逻辑,而是“一次校验、批量搬运”
普通for循环每次迭代都要做三件事:查数组长度、校验索引是否越界、读写元素——这些在字节码层反复执行;而arraycopy只在开始做一次参数合法性检查(null判断、索引范围、长度非负、类型兼容),之后直接触发CPU级内存指令,把整段数据当“黑盒”搬走。
- 基本类型数组(如
int[]):纯粹复制原始字节,无GC写屏障、无对象头开销 - 引用类型数组(如
String[]):只复制引用地址,不触达对象实例内部 - 同一数组内重叠拷贝(如左移一位):JVM自动选择前向/后向安全策略,等效于
memmove语义
它依赖严格的预分配与类型匹配
性能优势的前提是你已准备好目标数组,并确保类型兼容:
- 目标数组必须提前创建,且
destPos + length ≤ dest.length,否则立刻抛异常 - 源和目标数组元素类型需协变兼容:子类数组可拷入父类数组(
String[] → Object[]),但int[]和long[]完全不兼容,运行时报ArrayStoreException - 不做任何隐式转换:不装箱、不拆箱、不扩缩容、不填充默认值
它被JVM深度优化,不是普通native方法
不同于一般JNI调用,arraycopy在HotSpot中被特殊注册和内联处理:
- 小数组(≤16元素)可能被JIT编译器展开为若干寄存器赋值指令
- 大数组自动切分,部分场景启用SIMD向量化搬运
- 跨代拷贝时可绕过部分卡表更新,减少GC干扰
它快,但只在“对的场景”下才真正快
若目标数组未预分配、长度估算错误、或拷贝量极小(如2~3个元素),其JNI调用开销反而可能高于简单赋值。它的高性能,本质是把“可控的确定性”交还给开发者——你负责准备内存和参数,它负责以最硬核的方式完成搬运。











