Java如何为对象的成员构造内存?

时间:2013-12-20 00:13:07

标签: java memory-management

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

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

  1. 即使在64位系统上,Java是否仅限于32位地址空间?
  2. Java是否限制为每个数组32位地址空间,然后每个数组对象都有一个指向元素所在位置的指针?
  3. 别的什么?
  4. 第二,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个字节是什么?
    3. 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 byte 3;”请注意,该字节已分配,因此它不仅仅是一个空指针。这种方法比其他两种方法占用更少的内存。如何???
      4. 任何有关此处发生的事情的指导都表示赞赏。我有几个分配了很多的类,飞轮模式不起作用(这些对象的值在整个地方都有变化)。

        相关问题,声明变量的顺序是否重要?回到过去做C ++编程的时候,声明“int,byte,int,byte”使用4 int的空间工作,而“int,int,byte,byte”使用3。

2 个答案:

答案 0 :(得分:1)

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

  

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

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

  

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

Java数组由int索引,为32位。

答案 1 :(得分:0)

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