【发布时间】:2014-01-08 18:08:27
【问题描述】:
我试图弄清楚 Java 如何为对象构造/分配内存。 (是的,这是特定于实现的。我为此使用了 Oracle 1.7 运行时。)我在 here 和 here 上做了一些工作,结果令人困惑。
首先,在两个引用的链接中,当我分配一个对象数组时,相当于 new Object[10000],每个对象使用 4 个字节。在 32 位系统上,这非常有意义。但是我在 64 位系统上,所以这里发生了什么?
- 即使在 64 位系统上,Java 是否也仅限于 32 位地址空间?
- Java 是否仅限于每个数组的 32 位地址空间,然后每个数组对象都有一个指向元素所在位置的指针?
- 还有别的吗?
第二,I compared the memory footprint of 8 booleans vs. a byte as the variables in a class。 8 个布尔值需要 24 个字节/对象或 3 个字节/布尔值。单字节方法需要 10 个字节/对象。
- 3 字节/布尔值是怎么回事?我会理解 4(使每个为 int)和绝对 1(使每个为字节。但是 3?
- 将一个字节扩展为 10 个字节是什么意思?我会理解 8 它将一个字节扩展为本机 int (我在 64 位系统上)。但是其他 2 个字节是怎么回事?
在different ways to create a RGB class it gets really weird的情况下。
- 对于由 3 字节变量组成的类,它使用 24 字节/实例。昂贵但可以理解,因为每个都使用 int。
- 所以我尝试了每个类都是单个 int,RGB 存储在 int 的一部分中(使用位移位)。它仍然是 24 字节/实例。为什么 Java 需要 3 个整数进行存储?这没有任何意义。
- 但最奇怪的情况是类有一个变量“byte[] color = new byte3;”请注意,字节已分配,因此它不仅仅是一个空指针。这种方法比其他两种方法占用更少的内存。怎么样???
感谢您就此处发生的情况提供任何指导。我有几个类被大量分配,而飞轮模式不起作用(这些对象的值在各处都发生了变化)。
还有一个相关的问题,声明变量的顺序重要吗?早在我做 C++ 编程的时候,声明“int, byte, int, byte”使用了 4 个 int 的空间,而“int, int, byte, byte”使用了 3 个。
【问题讨论】:
-
Java 运行时有 64 位和 32 位版本。
-
不指定内存的实际使用方式的好处是你可以有不同的方式来做这件事。相关:docs.oracle.com/javase/7/docs/technotes/guides/vm/…(64 位虚拟机中的 32 位指针)