diff options
author | Dmitry Petrochenko <dmitry.petrochenko@intel.com> | 2014-10-01 13:31:58 +0700 |
---|---|---|
committer | Dmitry Petrochenko <dmitry.petrochenko@intel.com> | 2014-10-02 12:06:38 +0700 |
commit | 6d7729d6ae8b2ac3800e92092d61390ce4e3b6d7 (patch) | |
tree | 6952c8a01e0b071b404a78b91fc536b89a22930c /test | |
parent | 8283e079a209e81caafd123a12a525922368fd34 (diff) | |
download | art-6d7729d6ae8b2ac3800e92092d61390ce4e3b6d7.zip art-6d7729d6ae8b2ac3800e92092d61390ce4e3b6d7.tar.gz art-6d7729d6ae8b2ac3800e92092d61390ce4e3b6d7.tar.bz2 |
Fix OOM throwing if it happens in finalizer reference
The Class::Alloc should return null if OOM happened during
adding finalizer reference, even if finalizable object is
allocated succesfully.
Change-Id: I66c1cdda50228bf1302839785ce4d4889b676f5b
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Diffstat (limited to 'test')
-rw-r--r-- | test/080-oom-throw/src/Main.java | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/test/080-oom-throw/src/Main.java b/test/080-oom-throw/src/Main.java index c93f8bb..63c5215 100644 --- a/test/080-oom-throw/src/Main.java +++ b/test/080-oom-throw/src/Main.java @@ -15,13 +15,15 @@ */ public class Main { + static char [][] holder; + static class ArrayMemEater { static boolean sawOome; static void blowup(char[][] holder) { try { for (int i = 0; i < holder.length; ++i) { - holder[i] = new char[1024 * 1024]; + holder[i] = new char[1022 * 1024]; } } catch (OutOfMemoryError oome) { ArrayMemEater.sawOome = true; @@ -50,8 +52,30 @@ public class Main { } } - static boolean triggerArrayOOM() { - ArrayMemEater.blowup(new char[128 * 1024][]); + static class InstanceFinalizerMemEater { + static boolean sawOome; + static InstanceFinalizerMemEater hook; + + InstanceFinalizerMemEater next; + + static InstanceFinalizerMemEater allocate() { + try { + return new InstanceFinalizerMemEater(); + } catch (OutOfMemoryError e) { + InstanceFinalizerMemEater.sawOome = true; + return null; + } + } + + static void confuseCompilerOptimization(InstanceFinalizerMemEater instance) { + hook = instance; + } + + protected void finalize() {} + } + + static boolean triggerArrayOOM(char[][] holder) { + ArrayMemEater.blowup(holder); return ArrayMemEater.sawOome; } @@ -67,11 +91,29 @@ public class Main { return InstanceMemEater.sawOome; } + static boolean triggerInstanceFinalizerOOM() { + InstanceFinalizerMemEater memEater = InstanceFinalizerMemEater.allocate(); + InstanceFinalizerMemEater lastMemEater = memEater; + do { + lastMemEater.next = InstanceFinalizerMemEater.allocate(); + lastMemEater = lastMemEater.next; + } while (lastMemEater != null); + memEater.confuseCompilerOptimization(memEater); + InstanceFinalizerMemEater.hook = null; + return InstanceFinalizerMemEater.sawOome; + } + public static void main(String[] args) { - if (triggerArrayOOM()) { + // Keep holder alive to make instance OOM happen faster + holder = new char[128 * 1024][]; + if (triggerArrayOOM(holder)) { System.out.println("NEW_ARRAY correctly threw OOME"); } + if (!triggerInstanceFinalizerOOM()) { + System.out.println("NEW_INSTANCE (finalize) did not threw OOME"); + } + if (triggerInstanceOOM()) { System.out.println("NEW_INSTANCE correctly threw OOME"); } |