System.arraycopy 是 JVM 底层内存搬运原语,支撑数组结构调整、环形缓冲区整理、缓存同步、子段隔离等关键场景,零对象创建、无 GC 干扰、高效安全。

System.arraycopy 是 Java 中直接触发 JVM 底层内存搬运的原语,不创建新对象、不走 Java 层循环,只做地址级数据平移。它在内存数据结构操作中不是“辅助工具”,而是底层支撑的关键机制。
数组型集合的物理结构调整
ArrayList、ArrayDeque 等基于数组的结构,其增删逻辑高度依赖 arraycopy 实现低开销位移:
- 删除指定索引元素时(如 remove(3)),自动调用 System.arraycopy(elementData, 4, elementData, 3, size−4),将后续所有元素前移一位
- ArrayDeque 扩容时,不重建环形逻辑,而是用 arraycopy 将旧缓冲区中有效段(head 到 tail 绕回部分)连续复制到新数组首部
- 批量删除(如 removeAll)在 JDK 8+ 中被优化为单次或有限次数的 arraycopy,避免逐个移动带来的 O(n²) 开销
环形缓冲区(RingBuffer)的数据整理
在高吞吐流处理中,RingBuffer 常用固定 byte[] 实现,arraycopy 是维持其“逻辑连续性”的核心操作:
- 消费端读走一段后,剩余未处理数据位于 [readPos, writePos),需前移到 buffer 起始位置:System.arraycopy(buffer, readPos, buffer, 0, unreadCount)
- 写入新数据前,若尾部空间不足但头部已空,可先执行一次前移腾出连续空间,再追加——整个过程零新分配、无 GC 干扰
- 因源目标为同一数组且区间重叠,JVM 自动按 memmove 语义安全执行,无需手动判断方向
缓存与快照类结构的数据同步
对需要强一致读、低延迟更新的场景,arraycopy 支持“引用不变、内容就地刷新”的模式:
- 事件总线注册变更时,先用 arraycopy 复制当前 handler 数组快照,再原子更新 volatile 引用,读端永远看到完整、不可撕裂的视图
- 计算密集型模块(如实时指标聚合)生成新 int[] 结果后,直接覆盖旧缓存数组,避免引用替换引发的可见性问题和 GC 波动
- 对象数组拷贝仅复制引用,适合缓存刷新类操作;若需深拷贝,则需额外封装,arraycopy 不介入对象内部
分治与并行结构中的子段隔离
在多核友好设计中,arraycopy 用于快速切分共享数据,消除竞争:
- 消息分发器将处理器列表按 CPU 核数切片,用 arraycopy 把某一段快速复制到线程本地数组,避免跨段访问锁
- 优先级队列调整堆结构(如上浮/下沉)时,关键节点交换常伴随大块元素迁移,arraycopy 比循环赋值快 3 倍以上
- 注意:多线程并发写同一 dest 数组区域会数据撕裂,必须加锁或改用“新数组 + CAS 替换”策略

















