Java 在 Little Endian CPU 架构上运行时如何处理 Endianess?

问题描述

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

解决方法

Java 是 Big Endian,它如何在保持性能的同时处理 Little Endian CPU?

Java 不是 Big Endian。在 Java 运行时库中 Endianness 甚至是一个问题的少数几个地方,API 使用 Big Endian,但它总是有很好的文档记录,并且一些 API 允许您指定所需的 Endianness。>

JVM(OpenJDK、OpenJ9 等)是否进行了任何特殊优化以保持性能,例如在 Little Endian 平台的特殊情况下仅选择性地成为 Big Endian?

不,JVM 使用本机字节序。

在访问 ByteBuffers 或调用本机代码或写入 IO 或访问 volatile 变量时是否有特殊的字节序处理?

是,否,是和否。

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

Java 如何改变 Little Endian 架构中的字节序?

与您在任何地方更改 Endianness 的方式相同,它交换字节,或以适当的顺序读取/写入字节。

在什么点或操作(加载、存储、计算、寄存器、缓存、内存等)改变了字节序?

不是,因为 JVM 使用本机字节序。 Endianness 仅在本机值转换为字节或从字节转换时应用。在任何其他时间点,字节序都无关紧要。

这会带来什么样的性能损失?

无,因为它什么都不做。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...