在Java

时间:2017-11-18 22:02:55

标签: java memory data-structures structure

假设我的程序有一个简单的对象Key,它可以用作更大对象的键。 (这超出了问题的范围)可能有成千上万的这些密钥飞来飞去,所以确保在这些对象的不同列表中存在最少量的重复是很重要的(所以我们不会堵塞没用无用物品的记忆。)

6 Key objects

这里的问题是这些关键对象可以被分组,并且可以同时是多个组的一部分。让我们将这6个对象分成3个样本组:

6 objects in 3 groups

有一个单独的并发列表可以跟踪所有组,并且可能会有数十个这些组不断创建和删除。但由于此组系统可用于查询操作,例如Which groups is this Key inside of?,因此我们需要某种索引来快速从对象查询到组。

这是我们目前所拥有的系统:

  • 存储所有组的并发映射(ConcurrentMap<Key, Set<KeyGroup>>,'全局映射'),使用密钥本身编制索引。
  • 每个KeyGroup都包含一组Key(该组内容)

  • X 键添加到 G 组时

    1. X 已添加到组的键集
    2. G 组添加到全局地图中,并将 K 键作为索引
  • 要查询某个键与哪个组不同,它将用作全局地图作为索引(Set<KeyGroup> groups = globalMap.get(key)

此系统的主要问题是Key对象的重复:

  • 全局地图具有索引地图的关键对象(即Set<Key>
  • 每个小组都包含自己的Set<Key>
  • 由于每个组都有自己的设置,并且每个键都有自己的一组组,因此会以指数方式增加Keys的数量。

显然,我们正在考虑优化整个过程。由于我们使用的是Java,是否有可以管理这个系统的库(看起来有点像维恩图)更有效率,还避免了重复键?

我还认为,当密钥不再使用时,内置的Java垃圾收集不会清除整个混乱。我错了吗?当我分析程序使用的内存时,即使没有创建“新”组/添加密钥,内存中的密钥数量也会不断增加。

0 个答案:

没有答案