/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
class LargeAlloc {
static long allocSize = 0; // in megabytes
static int itemSize = 16 * 1024;
static int sizeCount = 10;
static double sizeRatio = 1.5;
static double timeLimit = 120;
public static byte [] junk;
public static void main(String[] args) throws Throwable {
boolean base = true;
if (args.length == 0) {
System.out.println("No argument. Assuming base");
}
if (args[0].compareTo("opt") == 0 || args[0].compareTo("perf") == 0) {
base = false;
timeLimit = 600;
}
allocSize = base ? 500 : 3000;
runTest();
System.exit(0);
}
public static void runTest() throws Throwable {
System.out.println("LargeAlloc running with " + allocSize + " Mb of allocation");
System.out.println("Run with verbose GC on and make sure space accounting is not leaking");
System.out.println();
long lastUsed = 0;
long used = 0;
long limit = allocSize * 1024 * 1024;
long start = System.currentTimeMillis();
System.gc();
long startUsed = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
while (used < limit) {
int curSize = itemSize;
for (int i = 0; i < sizeCount; i++) {
junk = new byte[curSize];
used += itemSize;
curSize = (int) (curSize * sizeRatio);
}
if (used - lastUsed > 100 * 1024 * 1024) {
long cur = System.currentTimeMillis();
System.out.println("Allocated " + (used >> 20) + " Mb at time " + ((cur - start) / 1000.0) + " sec");
lastUsed = used;
}
long cur = System.currentTimeMillis();
double elapsed = (cur - start) / 1000.0;
if (elapsed > timeLimit) {
System.out.println("Exitting because exceeded time limit of " + timeLimit + " seconds");
break;
}
}
System.gc();
long endUsed = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println();
System.out.print("After allocation, usedMemory has increased by ");
System.out.println(((endUsed - startUsed) / (1024.0 * 1024.0)) + " Mb");
System.out.println("ALL TESTS PASSED");
}
}