【问题标题】:How does Java Handle Endianess when running on Little Endian CPU Architectures?在 Little Endian CPU 架构上运行时,Java 如何处理 Endianess?
【发布时间】:2021-03-30 23:59:06
【问题描述】:

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

【问题讨论】:

  • Java 本身没有字节序。类文件具有字节顺序,但这只是一种编码,无论字节顺序如何,都可以很容易地从它们中解码整数;即使对于更深奥的格式也是如此。寄存器中的整数只是存储为该寄存器,类型化数组不允许您将它们转换为字节。

标签: java performance cpu-architecture endianness openj9


【解决方案1】:

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

Java 不是大端。在 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 架构中的字节序?

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

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

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

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

无,因为它什么都不做。

【讨论】:

  • 感谢您的回答。这个问答:Java's Virtual Machine's Endianness 说 JVM 是 Big Endian。一条评论说字节序被维护为一个 POV。
  • 另外The Java Virtual Machine Specification, Java SE 15 Edition, Section 2.11 说:The number and size of the operands are determined by the opcode. If an operand is more than one byte in size, then it is stored in big-endian order - high-order byte first. For example, an unsigned 16-bit index into the local variables is stored as two unsigned bytes, byte1 and byte2, such that its value is (byte1 << 8) | byte2.
  • class-file 总是 Big-Endian(它必须选择 1 个选项,因为它必须在所有平台上保持不变);但是 JVM 使用 platform endiannes,并且只需要在从可能有也可能没有不同字节序的源(例如类文件)读取字节时执行转换跨度>
  • @SumindaSirinathS.Dharmasena 存储在字节码文件 (.class) 中的 bytes 与存储数据的方式之间存在很大差异在运行的 JVM 中的 memory 中。您所有的 cmets 以及您评论的第一个链接中接受的答案都是关于字节码文件的。您的问题是关于 JVM(Java 虚拟 Machine),这就是这个答案所要解决的问题。
  • @SumindaSirinathS.Dharmasena 正确,除了:2)“内存中的字节码/操作码”不完整,因为它们可能会被 JIT 转换为本地 CPU 指令以获得更好的性能。即使没有 JIT,JVM 也可能以不同于存储在字节码文件中的方式存储字节码/操作码。这都是内部的,JVM 可以为所欲为。
猜你喜欢
  • 2020-12-01
  • 1970-01-01
  • 2014-10-14
  • 2011-04-10
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 2019-06-30
相关资源
最近更新 更多