我的项目遇到了一些内存问题,因此我决定对某些部分进行压力测试以查看一些性能测量结果。我正在使用 Google 的ConcurrentLinkedHashMap
库作为 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()
是个坏主意。如果是这样,有效清理内存的好方法是什么?
旁注:有谁知道退货有什么size()
用?返回正确的值,但我担心会返回更大的值..ConcurrentLinkedHashMap
weightedSize()
size