【问题标题】:Java collections memory consumptionJava 集合内存消耗
【发布时间】:2011-03-11 11:57:53
【问题描述】:

假设我实例化了 100 000 个向量

a[0..100k] = new Vector<Integer>();

如果我这样做

a[0..100k] = new Vector<Integer>(1);

它们会占用更少的内存吗?那就是忽略它们是否有东西,以及当必须有超过 1 个元素时扩展它们的开销。

【问题讨论】:

  • 我很惊讶上面的代码竟然可以编译
  • 这只是我对伪伪代码的尝试。
  • Vector是如此java1.2。使用当前的东西。
  • @seanizer 或者 CLDC... 因为没有别的东西,除非你自己创建它。

标签: java memory collections


【解决方案1】:

当您创建Vector 时,您可以在开始时指定您希望它具有的大小或保留一些默认值。但应该注意的是,无论如何存储在Vector 中的所有内容都只是一堆引用,与它们实际指向的对象相比,它们占据的位置非常小。

所以是的,您最初将保存位置,但仅保存等于默认大小与指定大小之间的差值乘以引用变量大小的数量。如果您像您的情况一样创建大量向量,则初始大小确实很重要。

【讨论】:

    【解决方案2】:

    根据Javadoc,向量的默认容量是 10,所以我希望它比容量为 1 的向量占用更多的内存。

    在实践中,您可能应该use an ArrayList,除非您需要使用另一个需要向量的 API。

    【讨论】:

    • 干杯,是的,我宁愿举个例子,但请注意!
    【解决方案3】:

    是的,他们会的。当需要从根本上改善程序的内存消耗时,我首先要做的事情之一就是为集合设置合理的“初始大小”。

    【讨论】:

      【解决方案4】:

      是的,会的。默认情况下,Vector 为 10 个元素分配空间。

      向量() 构造一个空向量,使其内部数据数组的大小为 10 其标准容量增量为零。增量为零。

      因此,它为 10 个内存引用保留内存。

      话虽如此,在现实生活中,这很少是一个问题。如果您真的要生成 100,000 个向量,则需要重新考虑您的设计增量为零。

      【讨论】:

        【解决方案5】:

        嗯,是的。 IIRC Vector 默认在内部初始化 16 个元素,这意味着由于底层 VM 完成的字节对齐和其他操作,您将节省大量内存最初

        但是,你想要完成什么?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-16
          • 2018-04-27
          • 2020-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多