【问题标题】:Why each slot of the local variable array in a stack frame is of 4 bytes, and not 1 byte in the JVM?为什么堆栈帧中局部变量数组的每个槽都是 4 个字节,而不是 JVM 中的 1 个字节?
【发布时间】:2017-01-06 16:54:50
【问题描述】:

局部变量数组的每个槽是 4 字节。因此,要存储字符、短变量或字节变量,需要使用一个插槽。意味着所有较小的数据类型在内部都被转换为 int 数据类型。

我的疑问是:

1)。如果在内部它们是 4 字节,它是否不会使较小的数据类型变得无用?,如果是,为什么不从语言中删除这些数据类型? 2)。如果每个插槽都是 1 字节,则不会浪费内存。为什么不是每个插槽都是 1 字节的?

【问题讨论】:

  • 我不相信有任何说明它是 4 字节的,因为它只是一个虚拟插槽。注意:64 位引用仍然使用一个插槽。
  • artima.com/insidejvm/ed2/jvm8.html,参见“局部变量”部分的第二段。这位先生的时间是16:00到25:00。 youtube.com/…
  • 这只是一种实现。
  • JVM字节码和JVM规范使用的抽象虚拟机,就是:abstract。实际实现不必使用其概念的 1:1 映射,只要它们的可观察行为相同即可。这包括堆栈布局。

标签: java jvm local-variables stack-memory


【解决方案1】:

如果内部数据类型为 4 字节,是否会使较小的数据类型变得无用?,

寄存器始终为 32 位或 64 位,具体取决于架构。当您在内存中存储大量值时,使用 1 字节、2 字节或 4 字节加起来的值永远不会少。

如果每个插槽都是 1 字节,则不会浪费内存。为什么不是每个插槽都是 1 字节的?

一个字节只能存储256个值,不能存储更大的范围。我想你的意思是;为什么不是所有内容都是 1 字节的倍数?没关系,因为内存使用是虚拟的。可以优化实际内存使用情况。

【讨论】:

    【解决方案2】:

    1)。如果在内部它们是 4 字节,它不会使较小的数据类型变得无用吗?

    当涉及到局部变量或算术时,是的,使用较小的数据类型可能毫无用处,甚至会因为需要进行值集转换而浪费性能。

    但是,除了局部变量之外,还有一个,对于字段和数组,它可以产生(特定于实现的)差异。

    如果是,为什么不从语言中删除此类数据类型?

    首先,如上所述,有堆。其次,有 I/O。您正在以字节或字符的形式与外界交换数据,或者,现在,代码点。因此,除了存储大小之外,这些数据类型还带有语义。调用StringBuilder.append(char)StringBuilder.append(byte) 会有很大的不同,尽管在这两种情况下,实际上都传递了int 值。

    2)。如果每个插槽都是 1 字节,则不会浪费内存。为什么不是每个插槽都是 1 字节的?

    如果每个插槽都是一个字节,那么就不可能在其中存储任何其他内容。您将堆栈帧槽(用于局部变量和操作数堆栈)与实际存储混淆。插槽旨在保存任意数据类型的值,并且可以以与实现相关的方式映射到实际存储或 CPU 寄存器。 longdouble 占用两个插槽的事实是历史上的妥协,源于 Java 是在上世纪九十年代初设计的。

    如果它是今天设计的,您可以打赌,一个插槽将被定义为能够容纳 所有 数据类型,包括 longdouble。这里的关键点是架构的简化。如果为局部变量或特定底层架构的操作数使用较小的数据类型有潜在的好处,则由 JVM 实现来检测这一点并生成适当的本机代码。如前所述,在大多数情况下,由于局部变量和操作数堆栈条目被映射到 CPU 寄存器,因此没有这样的好处。

    【讨论】:

      【解决方案3】:

      局部变量存储在 4 个字节(bytecharshortintbooleanfloat,对对象的引用)或 8 个字节(longdouble )。

      但是变量不仅仅需要在函数的本地。 序列化可以使用最少的字节数。

      速度表现和空间占用之间存在混合。

      访问 4 字节变量更快,因为现代 CPU 使用 32 位或 64 位寄存器,因此任何从 4 位块中提取少量字节的操作对 cpu 来说都是浪费时间。

      【讨论】:

        【解决方案4】:

        由于数组的原因,我们无法从语言中删除 bytesbyte 的数组比 int 的数组小四倍。

        并且没有理由将变量槽设为 1 字节,因为它不会节省太多内存(堆栈通常比堆小得多)并且如果填充所有内容,内存的工作速度会更快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-29
          • 1970-01-01
          • 2020-07-07
          • 1970-01-01
          • 2021-05-25
          • 2023-03-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多