native 是 java 关键字,标识方法由 jvm 直接调用底层实现;system.arraycopy 的 native 实现通过 jni 绑定、类型判断、重叠检测、向量化及 gc 协同等机制实现高性能受控内存拷贝。

native 标识在 System.arraycopy 方法声明中,表示该方法没有 Java 层的实现代码,而是由 JVM 直接委托给底层平台(如 C/C++)完成。它不是语法糖,也不是 JVM 的“魔法”缩写,而是一个有明确定义的 Java 关键字,承担着关键的语义和运行时职责。
native 是一个编译与运行时契约
- 它告诉 Java 编译器:这个方法的逻辑不在
.java或.class文件里,无需生成字节码体; - 它告诉 JVM:调用此方法时,必须跳过常规方法调用栈,转而查找并执行已注册的本地函数(通过 JNI 机制绑定);
- 它隐含要求:JVM 必须在启动时或首次调用前,完成该 native 方法与底层函数(如
JVM_ArrayCopy)的符号映射。
底层对应的是高度特化的内存操作
System.arraycopy 的 native 实现不等于简单调用 memcpy——而是由 JVM 根据上下文动态选择最优路径:
- 类型判断:区分基本类型数组(
int[]、byte[])与对象数组(Object[]),前者可直接按字节块搬运,后者需保留引用语义; - 重叠检测:当
src == dest且区间重叠(如arraycopy(arr, 0, arr, 1, 5)),自动选用memmove语义或分段后向拷贝,避免数据覆盖; - 对齐与向量化:若源/目标地址按 8/16/32 字节对齐,JIT 可生成
rep movsq(x86)、ldp/stp(ARM64)甚至 AVX-512 指令,单次搬运 64 字节; - GC 协同:在老年代或跨代复制时,绕过部分写屏障(write barrier)或卡表(Card Table)更新,减少 STW 开销。
native 不代表“不可控”,而是“交由 JVM 精确控制”
与用户手动调用 Unsafe.copyMemory 不同,arraycopy 的 native 实现始终受 JVM 全程监管:
- 所有参数校验(空指针、索引越界、长度负值、类型不兼容)都在 native 入口一次性完成,不重复检查;
- 不触发解释执行,无字节码开销,也无 JIT 编译延迟——它是 JVM 内建的 intrinsic 方法之一;
- 即使在未启用 JIT 的 client 模式下,也能保持稳定高性能,因为 native 路径独立于 Java 方法编译流程。
简言之,native 在这里不是“甩锅给底层”,而是 JVM 主动接管、深度优化的关键信号。











