system.arraycopy 效率高是因为 jvm(hotspot c2)在运行时将其编译为硬件级内存指令,如 x86 的 rep movsq/avx-512 或 aarch64 的 ldp/stp/sve,配合缓存对齐、预取、向量化及无分支纯内存操作。

System.arraycopy 效率高,根本不在 Java 层,而在于 JVM(特别是 HotSpot C2 编译器)在运行时把它“替换成 CPU 指令”——它不执行你写的那行代码,而是直接调用硬件级内存操作。
直接映射到 CPU 块复制指令
当条件满足时,JIT 会跳过全部 Java 调用栈和字节码逻辑,生成等价于底层汇编的机器码:
- x86-64 上常用 rep movsq(一次搬 8 字节)、rep movsb(字节粒度)或 AVX-512 指令(单次搬 64 字节)
- AArch64 上倾向使用成对加载/存储指令,如 ldp/stp(一次读写两个 64 位寄存器),或 SVE 向量指令
- 这些指令由 CPU 硬件原生支持,走的是内存控制器直通路径,延迟远低于逐元素访问
利用缓存与预取机制
JIT 生成的拷贝代码会主动适配 CPU 缓存行为:
- 自动按缓存行(通常 64 字节)对齐搬运,减少 cache line miss
- 插入 prefetch 指令,提前把后续要读的数据载入 L1/L2 缓存
- 连续地址访问模式完美匹配现代 CPU 的预取器(streaming prefetcher),吞吐接近内存带宽上限
向量化与并行访存能力
不是“多线程”,而是单线程内榨干 CPU 向量单元:
- 对齐的 int[] 或 byte[] 拷贝,JIT 可能生成 AVX2 的 vpmovzxbd + vmovdqu 组合,一次处理 32 字节
- 支持非临时存储(non-temporal store),绕过缓存直接写入内存,避免写分配(write-allocate)开销,适合大数组
- 源/目标地址若自然对齐(如 16/32/64 字节边界),触发宽向量路径的概率大幅提高
无分支、无循环控制开销
对比 for 循环,它彻底消除了软件层面的控制流瓶颈:
- 没有循环计数器加法、没有每次迭代的 i 判断、没有跳转指令(jmp / jle)
- 边界检查只做一次(入口处),之后全是“裸指针 + 偏移”的纯内存操作
- 零函数调用开销:不压栈、不保存寄存器、不处理异常帧——异常由 native 层统一捕获并抛出











