天天看点

java同步的集合_同步Java集合的内存管理

我正在尝试对我们的一部分软件进行手动内存管理。我们在一个使用字符串作为键、列表作为值的映射中保存了很多项。这些列表中的每个hold对象都包含大小变化很大的JSON文件。为了控制内存泄漏而不影响GC,我试图为所有列表总共分配一定数量的内存。我通过获取一个对象的JSON字符串的大小来估计它的大小。根据列表中对象的大小,允许列表存储更多或更少的项。单个列表可用的特定内存来自当前列表的数量(这是动态的)和所有列表允许的总内存。

现在我有另一张地图,它包含了地图中每个列表的最大大小(对象数量)。在某些时间间隔内,我现在只需执行以下操作即可从列表中删除最旧的对象:

while(map.get(id).size()>maxAmountMap.get(id)){

map.get(id).remove(0);

}

由于列表只填充时间,它们将以一个相当大的后备数组开始,一旦更多的对象进入,它们应该会变小。

因为多个进程访问这些列表,所以我将它们包装为:

Collections.synchronizedList(new ArrayList<>());

关于创造它们。

现在ArrayList确实有一个trimToSize()方法,但是由于它包装在一个同步列表中,我似乎无法访问这个函数。

另外,如果我有办法得到支持ArrayList并对其进行修剪,那可能会破坏使用SynchronizedList的目的,因为我不再是线程安全的(如果我在这里想得对的话)。

有没有任何方法可以调整SynchronizedList的大小,或者内存浪费是可以忽略的,因为我们只是在讨论几个8字节的指针,而列表可能存储大小高达几兆字节的对象?

有没有更好的办法?