我遇到了一些与我的项目有关的内存问题,因此我决定对某些部分进行压力测试以查看一些性能测量结果。我使用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
我没有看到的LRU缓存的evicted
条目被清理出于某种原因。我听说手动呼叫System.gc()
是一个坏主意。如果是这样,有效清理内存的好方法是什么?
一边注意:有没有人知道size()
为ConcurrentLinkedHashMap
返回? weightedSize()
返回正确的值,但我担心size
返回的东西明显更大..
你如何获得统计信息?例如:大小:423902加权大小:200001内存:0.11229571913729916 ... – fuyou001 2013-05-07 10:06:16