diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/080-oom-throw/expected.txt | 1 | ||||
| -rw-r--r-- | test/080-oom-throw/src/Main.java | 49 | ||||
| -rw-r--r-- | test/104-growth-limit/src/Main.java | 6 | ||||
| -rwxr-xr-x | test/etc/run-test-jar | 3 |
4 files changed, 56 insertions, 3 deletions
diff --git a/test/080-oom-throw/expected.txt b/test/080-oom-throw/expected.txt index 73cc0d8b3e..904393bc3b 100644 --- a/test/080-oom-throw/expected.txt +++ b/test/080-oom-throw/expected.txt @@ -1,2 +1,3 @@ +Test reflection correctly threw NEW_ARRAY correctly threw OOME NEW_INSTANCE correctly threw OOME diff --git a/test/080-oom-throw/src/Main.java b/test/080-oom-throw/src/Main.java index c93f8bbc54..f007b2535c 100644 --- a/test/080-oom-throw/src/Main.java +++ b/test/080-oom-throw/src/Main.java @@ -14,6 +14,9 @@ * limitations under the License. */ +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + public class Main { static class ArrayMemEater { static boolean sawOome; @@ -68,6 +71,10 @@ public class Main { } public static void main(String[] args) { + if (triggerReflectionOOM()) { + System.out.println("Test reflection correctly threw"); + } + if (triggerArrayOOM()) { System.out.println("NEW_ARRAY correctly threw OOME"); } @@ -76,4 +83,46 @@ public class Main { System.out.println("NEW_INSTANCE correctly threw OOME"); } } + + static Object[] holder; + + public static void blowup() throws Exception { + int size = 32 * 1024 * 1024; + for (int i = 0; i < holder.length; ) { + try { + holder[i] = new char[size]; + i++; + } catch (OutOfMemoryError oome) { + size = size / 2; + if (size == 0) { + break; + } + } + } + holder[0] = new char[100000]; + } + + static boolean triggerReflectionOOM() { + try { + Class<?> c = Main.class; + Method m = c.getMethod("blowup", (Class[]) null); + holder = new Object[1000000]; + m.invoke(null); + holder = null; + System.out.println("Didn't throw from blowup"); + } catch (OutOfMemoryError e) { + holder = null; + } catch (InvocationTargetException e) { + holder = null; + if (!(e.getCause() instanceof OutOfMemoryError)) { + System.out.println("InvocationTargetException cause not OOME " + e.getCause()); + return false; + } + } catch (Exception e) { + holder = null; + System.out.println("Unexpected exception " + e); + return false; + } + return true; + } } diff --git a/test/104-growth-limit/src/Main.java b/test/104-growth-limit/src/Main.java index d666377b54..d31cbf1fe1 100644 --- a/test/104-growth-limit/src/Main.java +++ b/test/104-growth-limit/src/Main.java @@ -29,26 +29,28 @@ 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 { - List<byte[]> l = new ArrayList<byte[]>(); while (true) { // Allocate a MB at a time l.add(new byte[1048576]); alloc1++; } } catch (OutOfMemoryError e) { + l = null; } // Expand the heap to the maximum size. clear_growth_limit.invoke(runtime); int alloc2 = 1; + l = new ArrayList<byte[]>(); try { - List<byte[]> l = new ArrayList<byte[]>(); 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" + "limit cleared (" + alloc1 + " MBs > " + alloc2 + " MBs"); diff --git a/test/etc/run-test-jar b/test/etc/run-test-jar index 414e4df9f5..8dd7573974 100755 --- a/test/etc/run-test-jar +++ b/test/etc/run-test-jar @@ -225,7 +225,8 @@ if [ "$DEBUGGER" = "y" ]; then fi if [ "$USE_JVM" = "y" ]; then - ${JAVA} ${DEBUGGER_OPTS} ${JVM_VERIFY_ARG} -classpath classes $MAIN "$@" + # Xmx is necessary since we don't pass down the ART flags to JVM. + ${JAVA} ${DEBUGGER_OPTS} ${JVM_VERIFY_ARG} -Xmx256m -classpath classes $MAIN "$@" exit fi |