【问题标题】:What else can I use instead of a HashMap?我还能用什么来代替 HashMap?
【发布时间】:2010-07-15 11:43:46
【问题描述】:

在我的项目中,我从两台服务器获取表单条目并将它们保存在哈希图中。

key 是 serverName,value 是 2d ArrayList (ArrayList<ArrayList<Object>>)

在 ArrayList 中,我将属于该服务器上的表单的字段值保留。 我在两个服务器中比较这些值并将它们打印到一个 excel 文件中。

我的问题是,当我得到一个包含 12000 个条目和 100 个字段的表单时,这个映射使用了大约 400M 的内存。我不希望我的程序使用这么多内存。你有什么建议吗?

【问题讨论】:

    标签: java hashmap


    【解决方案1】:

    我怀疑它是导致您出现问题的哈希图,而是 ArrayList,因为它默认为 10 个条目分配空间。如果您只为每个索引存储一个或两个值,那将是一种浪费。

    您可以尝试将初始大小设置为 1 或 2,看看是否有帮助。一个潜在的缺点是,如果大小太小,会导致频繁的重新分配。但是,如果这导致任何显着放缓,您会发现自己。

    【讨论】:

      【解决方案2】:

      HashMap 根本不是问题所在。 ArrayList<ArrayList<Object>> 中实际包含哪些对象?

      你真的应该使用 VisualVM 并做一些heap profiling 来看看实际占用了你的内存。这比这里的猜测要好得多,您可能会对结果感到惊讶。

      【讨论】:

      • +1:一个好主意(尽管我仍然不同意你排除 ArrayList 的浪费问题)
      • 对象是字符串和一个长数字。我会尝试 VisualVM 并告诉结果。
      【解决方案3】:

      我想大部分内存浪费是由于使用了很多 ArrayLists。它们是为动态使用(添加和删除)而设计的,因此它们通常有许多未使用的位置。如果您的矩阵是静态的,请考虑使用二维数组而不是列表列表。否则,尝试将 ArrayList 的容量设置为某个估计值,而不是默认值。

      【讨论】:

      • 未使用的 ArrayList 插槽几乎从来都不是问题,因为它们只是引用,与列表中包含的对象相比,它们的大小微不足道。
      • @Michael:我完全不同意。例如,当您有 10000 个映射条目,每个条目存储 1000 个容量为 100 的列表的列表时,那么您“浪费”了 1G 内存。由于数组列表的倍增因子为 1.5,我假设在此计算中的空缺率为 25%。另外,我可以告诉你,我以前也遇到过这个问题,用数组解决了。
      • 除了当非浪费列表槽占用 3G 并且它们包含的对象至少另外 7.5G 时,1G 的“浪费”内存不太可能是重要的跨度>
      • @Michael:是的,根据这些假设,浪费约为 10%。我认为需要更多信息。例如,如果 OP 使用数组列表来存储原始值,那么无论数组列表利用率如何,数组都会节省大量空间。
      • 好点;如果使用数组避免使用包装类的用户,则可以节省更多。
      【解决方案4】:

      问题显然不在于 Hashmap 本身,因为它只有两个条目(键是您的两个服务器名称)。您只需要处理大量数据(2 x 12000 x 100 值,如果我做对了,再加上结果,即“excel 文件”)。它只是需要一些记忆。大对象是两个二维数组列表。地图只是引用了这些数据结构。

      通常我不会在意,只是将最大堆大小增加到 512M 甚至 1G。

      【讨论】:

        猜你喜欢
        • 2017-08-11
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 2010-12-06
        相关资源
        最近更新 更多