我有一个应用程序,它从文件中获取数据并将其存储以供以后使用。文件中的每一行对应一个对象Foo
,其中包含 n
对Bar
由单个字符组成的对象 String
,每个都有不同的 Name
。所以我像这样存储这些数据:
Foo extends HashMap<Name, Pair<Bar, Bar>>
哪里Pair<A, B>
是我自己的类,它只存储 2 个值并提供一些方法( equals
、 hashcode
等)。
我遇到的问题是,当我存储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 可能会成功。
关于java - Java中如何处理大量小对象的内存效率问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11844203/