【问题标题】:How does Java structure memory for an object's members?Java 如何为对象的成员构造内存?
【发布时间】:2014-01-08 18:08:27
【问题描述】:

我试图弄清楚 Java 如何为对象构造/分配内存。 (是的,这是特定于实现的。我为此使用了 Oracle 1.7 运行时。)我在 herehere 上做了一些工作,结果令人困惑。

首先,在两个引用的链接中,当我分配一个对象数组时,相当于 new Object[10000],每个对象使用 4 个字节。在 32 位系统上,这非常有意义。但是我在 64 位系统上,所以这里发生了什么?

  1. 即使在 64 位系统上,Java 是否也仅限于 32 位地址空间?
  2. Java 是否仅限于每个数组的 32 位地址空间,然后每个数组对象都有一个指向元素所在位置的指针?
  3. 还有别的吗?

第二,I compared the memory footprint of 8 booleans vs. a byte as the variables in a class。 8 个布尔值需要 24 个字节/对象或 3 个字节/布尔值。单字节方法需要 10 个字节/对象。

  1. 3 字节/布尔值是怎么回事?我会理解 4(使每个为 int)和绝对 1(使每个为字节。但是 3?
  2. 将一个字节扩展为 10 个字节是什么意思?我会理解 8 它将一个字节扩展为本机 int (我在 64 位系统上)。但是其他 2 个字节是怎么回事?

different ways to create a RGB class it gets really weird的情况下。

  1. 对于由 3 字节变量组成的类,它使用 24 字节/实例。昂贵但可以理解,因为每个都使用 int。
  2. 所以我尝试了每个类都是单个 int,RGB 存储在 int 的一部分中(使用位移位)。它仍然是 24 字节/实例。为什么 Java 需要 3 个整数进行存储?这没有任何意义。
  3. 但最奇怪的情况是类有一个变量“byte[] color = new byte3;”请注意,字节已分配,因此它不仅仅是一个空指针。这种方法比其他两种方法占用更少的内存。怎么样???

感谢您就此处发生的情况提供任何指导。我有几个类被大量分配,而飞轮模式不起作用(这些对象的值在各处都发生了变化)。

还有一个相关的问题,声明变量的顺序重要吗?早在我做 C++ 编程的时候,声明“int, byte, int, byte”使用了 4 个 int 的空间,而“int, int, byte, byte”使用了 3 个。

【问题讨论】:

标签: java memory-management


【解决方案1】:

这里的问题太多了,但我会解决其中的两个。

即使在 64 位系统上,Java 是否也仅限于 32 位地址空间?

32 位 Java 仅限于 32 位地址空间。 64 位 Java 不是。

Java 是否仅限于每个数组的 32 位地址空间,然后每个数组对象都有一个指向元素所在位置的指针?

Java 数组由 32 位的 int 索引。

【讨论】:

    【解决方案2】:

    了解您使用的是 64 位系统,但您运行的是 32 位还是 64 位 jvm? JVM 本身会影响许多会影响测试结果的优化。有许多 JVM(尽管公认只有少数很受欢迎),其中一些可能比其他的优化更好或不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多