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

标签 java performance cpu-architecture endianness openj9

Java 是 Big Endian 它如何在保持性能的同时处理 Little Endian CPU? JVM(OpenJDK、OpenJ9 等)是否进行了任何特殊优化以保持性能,例如在 Little Endian 平台的特殊情况下仅选择性地成为 Big Endian?访问 ByteBuffers 或调用 native 代码或写入 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,但它总是有很好的文档记录,并且一些 API 允许您指定所需的 Endianness。

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 使用 native 字节顺序。

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


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

How does Java change the endianess in Little Endian architectures?


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

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


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

What kind of performance penalty would this have?


没有,因为它什么都不做。

关于java - Java 在 Little Endian CPU 架构上运行时如何处理 Endianess?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65389086/

相关文章:

java - 跟踪更改的数据库设计 - w/Hibernate

java - 在Java中,byte[]与string作为方法参数有什么优缺点?

java - 在 GridLayout 中创建自定义删除键

x86 - 当预取队列中只剩下 1 个字节时,8086 是否启动 1 个字节的代码获取?

optimization - Intel 和 AMD 有何不同但仍然兼容?

java - 如何在liferay portlet中发送POST?

php - MySQL 匹配与喜欢

javascript - __proto__ 已弃用。什么是快速和跨浏览器的替代方案?

memory - 如果它们都需要两次内存访问,什么使 TLB 比页表更快?

python - 这个玩具环境中最好的多处理方法