/* * 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. */ import java.io.PrintStream; import org.jikesrvm.mm.mminterface.MemoryManager; import org.vmmagic.pragma.NoInline; class Exhaust { private static final PrintStream o = System.out; static Object [] first; static Object [] last; static final int itemSize = 64; static double growthFactor = 10.0; static int rounds = 5; static long tot = 0; // total # allocated static long wasAllocating; // How much were we allocating? public static void main(String[] args) { long mhs = MemoryManager.getMaxHeapSize().toLong(); o.println("Max heap size: " + mhs + " bytes"); if (mhs > 1024 * 1024) o.println(" that's " + mhs / (1024.0 * 1024.0) + " megabytes"); if (mhs > 1024 * 1024 * 1024) o.println(" that's " + mhs / (1024.0 * 1024 * 1024) + " gigabytes"); runTest(); System.exit(0); } @NoInline public static int doInner(int size) { while (true) { wasAllocating = size; Object [] next = new Object[size / 4]; last[0] = next; last = next; tot += size; wasAllocating = 0; } } @NoInline public static void runTest() { int size = itemSize; for (int i = 1; i <= rounds; i++) { o.println("Starting round " + i + " with size = " + size); first = new Object[1]; last = first; tot = 0; o.println(" Allocating until exception thrown"); try { doInner(size); } catch (OutOfMemoryError e) { first = last = null; // kills everything o.println(" Caught OutOfMemory - freeing now"); // this allocates; must follow nulling // o.println(" Maximum size reached is " + size); o.println(" Had " + tot + " bytes allocated; failed trying to allocate " + wasAllocating + " bytes"); } size *= growthFactor; } System.out.println("ALL TESTS PASSED"); } }