Я сталкиваюсь с некоторыми проблемами с памятью с моим проектом, поэтому я решил подчеркнуть некоторые порции, чтобы увидеть некоторые измерения производительности. Я использую библиотеку ConcurrentLinkedHashMap
Google в качестве кеша LRU. Соответствующие части моего кода тестирования приведены ниже:Усилие для очистки памяти
final ConcurrentLinkedHashMap cache = new ConcurrentLinkedHashMap.Builder<Long,Long>()
.maximumWeightedCapacity(200000)
.build();
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int count = 0;
while (count < 1000000) {
if (throttle) {
Thread.sleep(1000);
continue;
}
cache.put(random.nextLong(), random.nextLong());
count++;
}
}
}).start();
}
this.wait();
Я установил throttle
флаг true
когда память попадет более 50%. У меня есть контрольная нить, которая измеряет каждые 2
секунд. Вот цифры, которые я получил:
Size: 423902 Weighted Size: 200001 Memory: 0.11229571913729916
Size: 910783 Weighted Size: 200001 Memory: 0.25812696264655144
Size: 1373394 Weighted Size: 200001 Memory: 0.38996117352719034
Size: 2120239 Weighted Size: 200001 Memory: 0.6203725762957892
Size: 2114424 Weighted Size: 200000 Memory: 0.6233790564491212
Size: 2114424 Weighted Size: 200000 Memory: 0.6233790564491212
Size: 2114424 Weighted Size: 200000 Memory: 0.6233790564491212
Size: 2114424 Weighted Size: 200000 Memory: 0.6233790564491212
Size: 2114424 Weighted Size: 200000 Memory: 0.6233790564491212
Size: 2114424 Weighted Size: 200000 Memory: 0.6233790564491212
Я не видя evicted
записи кэша LRU очищаемой по некоторым причинам. Я слышал, что ручное вызов System.gc()
- плохая идея. Если да, то какой способ эффективно очистить память?
ON SIDE ПРИМЕЧАНИЕ: кто-нибудь знает, что делает size()
за ConcurrentLinkedHashMap
? weightedSize()
возвращает правильное значение, но я волнуюсь, что size
возвращает что-то значительно большее.
как вы получаете статистику? например: Размер: 423902 Взвешенный размер: 200001 Память: 0.11229571913729916 ... – fuyou001