java - Java中如何处理大量小对象的内存效率问题

标签 java oop memory

我有一个应用程序,它从文件中获取数据并将其存储以供以后使用。文件中的每一行对应一个对象Foo ,其中包含 nBar由单个字符组成的对象 String ,每个都有不同的 Name 。所以我像这样存储这些数据:

Foo extends HashMap<Name, Pair<Bar, Bar>>

哪里Pair<A, B>是我自己的类,它只存储 2 个值并提供一些方法( equalshashcode 等)。

我遇到的问题是,当我存储n=114时(这恰好是我测试数据中的数字)Pair我的Foo中的对象它的保留大小应该不超过 228 字节,而实际上它更像是 25kbytes。这意味着当我有 ~1000 Foo 时对象我需要 25MB 内存而不是 228kB,这是 Not Acceptable 。 (注意:每个Foo对象的键都是相同的,fooOne.keySet().equals(fooTwo.keySet()))

我正在使用VisualVM来分析我的应用程序,当我深入研究 Foo 的实例时我明白了:

Field           Type             Retained
-               
this            Foo              24750
...             
v table         HashMap$Entry[]  24662
  v [0]         HashMap$Entry    200
    v value     Pair             156
      v first   Bar              60
        ...
        > code  String           36
      v second  Bar              60
        ...
        > code  String           36
    v key       Name             72
      ...
      > name    String           36
  > [1]         HashMap$Entry    200
  > [2]        <HashMap$Entry>   -
  ...
  > [233]       HashMap$Entry    600
  ...
  > [255]      <HashMap$Entry>   -

正如您所看到的,所有有用的信息都被大量(对我来说)无用的数据包围着。如果我有更少、更大的具有相同数据的对象,我可以看到我的有用:无用比率会更好,但我看不出如何以任何其他方式实现这一点。有没有其他方法可以存储我的数据,但仍然像这样方便易用?

编辑

我的应用程序需要扩展到 6000 Bar 以上实例,也许有那么多 Foo实例。

最佳答案

我不完全确定我是否正确理解了你的问题,但在这种情况下使用 Flyweights 可能会成功。

Flyweight pattern

关于java - Java中如何处理大量小对象的内存效率问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11844203/

相关文章:

java - 关闭和访客模式之间有显着差异吗?

C++将私有(private)纯虚拟方法覆盖为公共(public)

oop - 我可以在继承类上获取父类名称(第一个)吗?

java - 接收java.sql.SQLException : out of memory

java - 在批处理模式下运行 matlab 时如何增加 java 堆内存大小

java.lang.ArrayIndexOutOfBoundsException : 4 Error

java - Spring 中具有两个 id 的同一实例

java - Virtualbox 在 Linux 上重置 vboxnet0 的 IP 地址

c++ - 我可以通过 for_each <algorithm> 在 C++ 中的指针 vector 上调用 `delete` 吗?

java - 单击按钮时表格未刷新