You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

java.lang.System与Unsafe的性能差异及JNI实现相关问询

System.arraycopy vs Unsafe.copyMemory(堆内场景):实现与开销分析

实现层面:是否依赖JNI?

  • Unsafe.copyMemory:确实基于JNI实现,对应你找到的unsafe.cpp中的底层逻辑,通过JNI桥接完成Java层到JVM原生代码的调用。
  • System.arraycopy:不依赖标准JNI调用,它是HotSpot JVM的内在方法(Intrinsic Method)——JVM对这个方法做了特殊识别与处理,不走常规JNI流程。你找不到对应JNI实现的原因是它的代码分散在JVM的多个核心模块:
    • 解释器模式下的实现位于src/share/vm/interpreter/interpreterRuntime.cpp(InterpreterRuntime::arraycopy方法)
    • JIT编译后的优化实现在src/share/vm/opto/arraycopy.cpp
    • 同时src/share/vm/classfile/vmSymbols.hpp中定义了它的符号标识,用于JVM识别该方法并触发特殊处理

堆内场景下的调用开销对比

二者开销差异明显,System.arraycopy的性能更优:

  1. 专属优化更深入:JVM针对数组拷贝场景做了大量定制化优化——比如根据数组元素类型(基本类型/引用类型)选择最优的内存复制策略,支持批量内存块复制;在JIT编译阶段还能消除数组边界检查、直接内联复制逻辑,彻底消除方法调用的额外开销。
  2. Unsafe.copyMemory的JNI开销:尽管部分Unsafe方法会被JVM内在化优化,但copyMemory作为通用内存复制接口,仍会保留JNI桥接的部分开销(如参数校验、跨上下文的调用处理);且它未针对Java数组的结构做适配,堆内场景下无法利用System.arraycopy的数组专属优化。

内容的提问来源于stack exchange,提问作者Bostonian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:36:35