package de.hub.emffrag.fragmentation;
import java.text.NumberFormat;
import java.util.Random;
import org.junit.Test;
import de.hub.emffrag.testmodels.testmodel.TestObject;
import de.hub.emffrag.testmodels.testmodel.TestObjectWithIndexes;
import de.hub.emffrag.testmodels.testmodel.frag.meta.TestModelFactory;
public class RamUsageTests extends AbstractFragmentationTests {
long totalMemory = -1;
long freeMemory = -1;
int meassure = 0;
int objects = 0;
/**
* With the use of the default in-memory data store, the memory usage will
* grow, even if everything works properly. This test only makes sense with
* a different data store.
*/
@Test
public void testConstantRamUsage() throws Exception {
initMemInfo();
TestObject container = addObject(null, false);
root.getContents().add(container);
Random random = new Random(0);
int numberOfFragments = 0;
int objects = 1000000;
for (int i = 0; i <= objects; i++) {
boolean fragmenting = random.nextBoolean();
TestObject object = addObject(container, fragmenting);
container.getCrossReferences().add(object); // cross references
// should not influence
// unloading
object.getCrossReferences().add(container);
if (random.nextFloat() < 0.3f) {
container = object;
}
if (fragmenting) {
numberOfFragments++;
}
if (i % 1000 == 0) {
printMemInfo();
}
}
model.save(null);
model.assertFragmentsIndex(0l, (long) numberOfFragments + 1);
model.assertStatistics(0, 5000, 0, objects, (int) ((objects / 2) * 0.8f), (int) ((objects / 2) * 1.2),
(int) ((objects / 2) * 0.8f), (int) ((objects / 2) * 1.2));
}
private void initMemInfo() {
totalMemory = -1;
freeMemory = -1;
meassure = 0;
}
private void printMemInfo() {
System.gc();
System.out.println("tm: " + NumberFormat.getIntegerInstance().format(Runtime.getRuntime().totalMemory())
+ " fm: " + NumberFormat.getIntegerInstance().format(Runtime.getRuntime().freeMemory()) + " unloads: "
+ model.getStatistics().getUnloads() + " loads: " + model.getStatistics().getLoads() + " creates: "
+ model.getStatistics().getCreates());
meassure++;
if (meassure > (objects / 1000) / 2) {
if (totalMemory == -1) {
totalMemory = Runtime.getRuntime().totalMemory();
} else {
// Assert.assertTrue("too much total memory: " +
// NumberFormat.getIntegerInstance().format(Runtime.getRuntime().totalMemory())
// +
// " vs " + totalMemory,
// Runtime.getRuntime().totalMemory() <
// totalMemory*1.3f);
}
if (freeMemory == -1) {
totalMemory = Runtime.getRuntime().freeMemory();
} else {
// Assert.assertTrue("too much memory used: " +
// NumberFormat.getIntegerInstance().format(Runtime.getRuntime().freeMemory()),
// Runtime.getRuntime().freeMemory() > freeMemory*0.8f);
}
}
}
@Test
public void testRamUsageWithIndexedContainment() {
initMemInfo();
TestObjectWithIndexes container = TestModelFactory.eINSTANCE.createTestObjectWithIndexes();
root.getContents().add(container);
objects = 10000;
for (int i = 0; i < objects; i++) {
container.getIndexedContents().add(createTestObject(i));
if (i % 1000 == 0) {
printMemInfo();
}
}
}
@Test
public void testRamUsageWithIndexedReferences() {
initMemInfo();
TestObjectWithIndexes container = TestModelFactory.eINSTANCE.createTestObjectWithIndexes();
root.getContents().add(container);
objects = 10000;
TestObject current = container;
for (int i = 0; i < objects; i++) {
TestObject to = createTestObject(i);
current.getFragmentedContents().add(to);
current = to;
container.getIndexedReferences().add(to);
if (i % 1000 == 0) {
printMemInfo();
}
}
}
}