当 运行 在 Little Endian CPU 架构上时,Java 如何处理字节顺序?

How does Java Handle Endianess when running on Little Endian CPU Architectures?

Java 作为 Big Endian,它如何在保持性能的同时处理 Little Endian CPU? JVM(OpenJDK、OpenJ9 等)是否进行任何特殊优化以保持性能,例如在 Little Endian 平台的特殊情况下仅选择性地成为 Big Endian?在访问 ByteBuffers 或调用本机代码或写入 IO 或访问 volatile 变量时是否有特殊的字节顺序处理? Java 如何改变 Little Endian 架构中的字节顺序?在什么点或操作(加载、存储、计算、寄存器、高速缓存、内存等)字节序发生变化?这会有什么样的性能损失?

Java being Big Endian how does it handle Little Endian CPUs while maintaining performance?

Java 不是 Big Endian。在 Java 运行时库中 Endianness 甚至是一个问题的少数几个地方,API 使用 Big Endian,但它总是有据可查,并且一些 APIs 允许您指定所需的字节顺序。

Does JVM (OpenJDK, OpenJ9, etc.) do any special optimisations to maintain performance like only selectively being Big Endian in special situation in Little Endian platforms?

不,JVM 使用本机字节顺序。

Is there special endianess handling when accessing ByteBuffers or calling native code or writing to IO or accessing volatile variables?

是、否、是、否

由于 JVM 使用本机字节顺序,因此调用本机代码或访问易变变量不需要处理。字节顺序仅在(反)序列化 to/from 字节时才重要,例如在访问 ByteBuffers 或写入 IO 时。

How does Java change the endianess in Little Endian architectures?

与您在任何地方更改字节序的方式相同,它交换字节,或者 read/writes 以适当的顺序交换字节。

At what point or operation (load, store, calculation, registers, cache, memory, etc.) is the endianess changed?

不是,因为 JVM 使用本机 Endianness。字节序仅在本机值转换为 to/from 字节时应用。在任何其他时间点字节顺序都不重要。

What kind of performance penalty would this have?

None,因为它什么都不做。