diff options
| -rw-r--r-- | test/104-growth-limit/src/Main.java | 55 |
1 files changed, 29 insertions, 26 deletions
diff --git a/test/104-growth-limit/src/Main.java b/test/104-growth-limit/src/Main.java index d31cbf1fe1..24acb91c1d 100644 --- a/test/104-growth-limit/src/Main.java +++ b/test/104-growth-limit/src/Main.java @@ -21,7 +21,6 @@ import java.util.List; public class Main { public static void main(String[] args) throws Exception { - int alloc1 = 1; // Setup reflection stuff before allocating to prevent OOME caused by allocations from // Class.forName or getDeclaredMethod. // Reflective equivalent of: dalvik.system.VMRuntime.getRuntime().clearGrowthLimit(); @@ -29,34 +28,38 @@ public class Main { final Method get_runtime = vm_runtime.getDeclaredMethod("getRuntime"); final Object runtime = get_runtime.invoke(null); final Method clear_growth_limit = vm_runtime.getDeclaredMethod("clearGrowthLimit"); - List<byte[]> l = new ArrayList<byte[]>(); - try { - while (true) { - // Allocate a MB at a time - l.add(new byte[1048576]); - alloc1++; - } - } catch (OutOfMemoryError e) { - l = null; - } + + int alloc1 = allocateTillOOME(); + + // Proactively clean up. + Runtime.getRuntime().gc(); + // Expand the heap to the maximum size. clear_growth_limit.invoke(runtime); - int alloc2 = 1; - l = new ArrayList<byte[]>(); - try { - while (true) { - // Allocate a MB at a time - l.add(new byte[1048576]); - alloc2++; - } - } catch (OutOfMemoryError e2) { - l = null; - if (alloc1 > alloc2) { - System.out.println("ERROR: Allocated less memory after growth" + + + int alloc2 = allocateTillOOME(); + + if (alloc1 > alloc2) { + System.out.println("ERROR: Allocated less memory after growth" + "limit cleared (" + alloc1 + " MBs > " + alloc2 + " MBs"); - System.exit(1); - } + } else { + System.out.println("Test complete"); } - System.out.println("Test complete"); + } + + private static int allocateTillOOME() { + int allocations = 0; + List<byte[]> l = new ArrayList<byte[]>(); + try { + while (true) { + // Allocate a MB at a time + l.add(new byte[1048576]); + allocations++; + } + } catch (OutOfMemoryError e) { + // Help clean up. + l.clear(); + } + return allocations; } } |