package org.infinispan.eviction.impl;
import java.util.Random;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.cache.StorageType;
import org.infinispan.container.DataContainer;
import org.infinispan.eviction.EvictionType;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.test.SingleCacheManagerTest;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
import org.testng.annotations.Test;
/**
* This test is useful to test how much memory is in use by the data container. Since the Java GC may not clean up
* everything on 1 pass, we have to run multiple passes through until we get a number that is relatively stable.
* @author William Burns
*/
@Test(groups = "profiling", testName = "eviction.MemoryEvictionTest")
public class MemoryEvictionTest extends SingleCacheManagerTest {
private final long MAX_MEMORY = 400 * 1000 * 1000;
private final int MATCH_COUNT = 5;
private final static Log log = LogFactory.getLog(MemoryEvictionTest.class);
@Override
protected EmbeddedCacheManager createCacheManager() throws Exception {
ConfigurationBuilder cfg = new ConfigurationBuilder();
cfg
.memory().storageType(StorageType.BINARY).evictionType(EvictionType.MEMORY).size(MAX_MEMORY)
.build();
EmbeddedCacheManager cm = TestCacheManagerFactory.createCacheManager(cfg);
cache = cm.getCache();
return cm;
}
public void testSimpleSizeEviction() {
log.debugf("Max memory: %d", MAX_MEMORY);
DataContainer dc = cache.getAdvancedCache().getDataContainer();
printMemoryUsage(dc.size());
Random random = new Random();
int matchCount = 0;
int byteKeySize = 10;
int byteValueSize = 100;
long previousMemorySize = 0;
for (int j = 0; j < 200; ++j) {
while (matchCount < this.MATCH_COUNT) {
for (int i = 0; i < 20000; ++i) {
byte[] keyBytes = new byte[byteKeySize];
byte[] valueBytes = new byte[byteValueSize];
random.nextBytes(keyBytes);
random.nextBytes(valueBytes);
cache.getAdvancedCache().put(keyBytes, valueBytes);
}
long memorySize = printMemoryUsage(dc.size());
if (memorySize == previousMemorySize) {
matchCount++;
}
previousMemorySize = memorySize;
}
}
}
// Also returns size
private long printMemoryUsage(int cacheSize) {
System.gc(); System.gc();
Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();
log.debugf("Used memory = %d, cache size = %d", usedMemory, cacheSize);
return usedMemory;
}
}