gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:36:36 26 4
gpt4 key购买 nike

我有一个应用程序,它从文件中获取数据并将其存储以备后用。文件中的每一行对应一个对象 Foo ,其中包含 nBar由单个字符组成的对象 String ,每个都有一个不同的 Name .所以我像这样存储这些数据:
Foo extends HashMap<Name, Pair<Bar, Bar>>
哪里Pair<A, B>是我自己的类,它只存储 2 个值并提供一些方法( equalshashcode 等)。

我遇到的问题是,当我存储n=114 (这恰好是我测试数据中的数字)Pair我的对象 Foo它的保留大小应该不超过 228 字节,而实际上它更像是 25 KB。这意味着当我有 ~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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com