Управление памятью синхронизированных коллекций Java - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь сделать ручное управление памятью для части нашего программного обеспечения. Мы храним много элементов на карте, которая использует строку в качестве ключа и имеет список в качестве значения. Каждый из этих списков содержит Объекты, которые содержат файлы JSON с очень разными размерами. Чтобы контролировать утечки памяти, не мешая работе ГХ, я пытаюсь выделить определенный объем памяти для всех списков. Я оцениваю размер объекта, получая размер его строки JSON. В зависимости от того, насколько велики объекты в списке, в списке будет разрешено хранить больше или меньше элементов. Конкретная память, доступная для одного списка, определяется количеством существующих списков (которые являются динамическими) и общим разрешенным объемом памяти для всех списков.

У меня теперь есть другая Карта, которая содержит максимальный размер (по количеству объектов) для каждого Списка на карте. Через определенные промежутки времени я теперь удаляю самые старые объекты из списка, просто набирая:

while(map.get(id).size()>maxAmountMap.get(id)){
  map.get(id).remove(0);
}

Поскольку списки заполняются только со временем, они начнутся с довольно большого резервного массива, который, как предполагается, станет меньше, когда в него будет добавлено больше объектов. Поскольку к этим спискам обращаются несколько процессов, я обернул их все следующим образом:

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

О создании их. Теперь у ArrayList есть метод trimToSize (), но, поскольку он заключен в SynchronizedList, я не могу получить доступ к этой функции.

Кроме того, если бы у меня был способ получить резервный ArrayList и обрезать его, это, вероятно, отрицательно сказалось бы на использовании SynchronizedList, поскольку я больше не был бы безопасен для потоков (если я думаю, что здесь правильно).

Есть ли какой-нибудь способ изменить размер SynchronizedList, или память тратится впустую, поскольку мы просто говорим о паре 8-байтовых указателей по сравнению со списками, которые могут хранить объекты размером до нескольких мегабайт?

Может быть, есть лучший способ сделать это?

...