代码之家  ›  专栏  ›  技术社区  ›  Manuel Selva

为什么创建一个大的Java数组会占用这么多内存?

  •  4
  • Manuel Selva  · 技术社区  · 14 年前

    为什么下面这行

        Object[] objects = new Object[10000000];
    

    导致JVM占用大量内存(~40M)?在分配数组时,有没有办法知道虚拟机的内部工作情况?

    10 回复  |  直到 9 年前
        1
  •  22
  •   Jon Skeet    10 年前

    这样就为10000000个引用分配了足够的空间,同时也为数组对象本身分配了少量开销。

    实际大小将取决于虚拟机-但它肯定不奇怪,它占用了相当数量的内存。。。我希望 至少 compressed oops 对于阵列。

    当然,如果你用那么多不同的对象填充数组,那会占用更多的内存。。。但是数组本身仍然需要空间来存放引用。

        2
  •  17
  •   Nikita Rybak    14 年前

    你说的“很多记忆”是什么意思?分配10000000个指针,每个指针占用4个字节(在32位机器上)-这大约是40mb内存。

        3
  •  3
  •   Randolpho    14 年前

    所以用这一行就可以创建40或80兆字节的数据。

        4
  •  3
  •   gpeche    14 年前

    你预留了一千万个参考的空间。那是相当多的。

        5
  •  3
  •   Jeff    14 年前

    它会导致大量内存被使用,因为它需要为1000万个对象及其相关开销分配堆空间。

    要查看JVM的内部工作,您可以 check out its source code ,因为它是开源的。

        6
  •  3
  •   Ira Baxter    14 年前

        7
  •  3
  •   Community miroxlav    7 年前

    它创建了一个包含10.000.000个引用指针的数组,所有指针都用 null .

    你以为这是“很多”吗?


    进一步阅读

        8
  •  2
  •   tdtje    14 年前

    原因是数组内容的空间被分配为一个连续的内存块。

        9
  •  2
  •   Yanick Rochon    14 年前

    根据 this Object 容纳10M的元素,那么从一开始就只使用了大约40MB的内存。如果你开始用10米的物体填充这个数组,那么它的大小会迅速增加。

    this 我刚刚在我的64位机器上测试了它,它的大小和一个普通的 对象 大约为12字节+(4+31字节)*10M=350000012字节(或345.78MB)

    我建议您使用某种随机访问文件来保存数据,如果您必须在程序中保存这么多数据的话。甚至使用数据库,例如 Apache Derby ,这也将使您能够对数据进行排序和筛选等。

        10
  •  0
  •   Jerry Carter    14 年前

    我可能落后于时代,但我从《实用Java》一书中了解到,向量比数组更高效、更快。可以用向量代替数组吗?