13ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski/*
23ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski * Copyright (C) 2014 The Android Open Source Project
33ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski *
43ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski * Licensed under the Apache License, Version 2.0 (the "License");
53ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski * you may not use this file except in compliance with the License.
63ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski * You may obtain a copy of the License at
73ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski *
83ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski *      http://www.apache.org/licenses/LICENSE-2.0
93ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski *
103ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski * Unless required by applicable law or agreed to in writing, software
113ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski * distributed under the License is distributed on an "AS IS" BASIS,
123ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski * See the License for the specific language governing permissions and
143ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski * limitations under the License.
153ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski */
163ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski
173ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotskiimport java.util.Vector;
183ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski
193ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotskipublic class Main {
203ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    static char [][] holder;
213ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski
223ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    static class ArrayMemEater {
233ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        static boolean sawOome;
243ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski
253ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        static void blowup(char[][] holder) {
263ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski            try {
273ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski                for (int i = 0; i < holder.length; ++i) {
283ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski                    holder[i] = new char[1024 * 1024];
293ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski                }
303ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski            } catch (OutOfMemoryError oome) {
313ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski                ArrayMemEater.sawOome = true;
323ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski            }
333ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        }
343ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    }
353ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski
363ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    static class InstanceFinalizerMemEater {
373ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        public void finalize() {}
383ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    }
393ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski
403ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    static boolean triggerArrayOOM(char[][] holder) {
413ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        ArrayMemEater.blowup(holder);
423ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        return ArrayMemEater.sawOome;
433ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    }
443ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski
453ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    static boolean triggerInstanceFinalizerOOM() {
463ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        boolean sawOome = false;
473ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        try {
483ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski            Vector v = new Vector();
493ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski            while (true) {
503ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski                v.add(new InstanceFinalizerMemEater());
513ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski            }
523ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        } catch (OutOfMemoryError e) {
533ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski            sawOome = true;
543ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        }
553ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        return sawOome;
563ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    }
573ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski
583ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    public static void main(String[] args) {
593ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        // Keep holder alive to make instance OOM happen faster.
603ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        holder = new char[128 * 1024][];
613ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        if (!triggerArrayOOM(holder)) {
62e2b6997f7e7112af6acfbf4f7184aa70dfad97ffHiroshi Yamauchi            // The test failed here. To avoid potential OOME during println,
63e2b6997f7e7112af6acfbf4f7184aa70dfad97ffHiroshi Yamauchi            // make holder unreachable.
64e2b6997f7e7112af6acfbf4f7184aa70dfad97ffHiroshi Yamauchi            holder = null;
653ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski            System.out.println("NEW_ARRAY did not throw OOME");
663ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        }
673ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski
683ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        if (!triggerInstanceFinalizerOOM()) {
69e2b6997f7e7112af6acfbf4f7184aa70dfad97ffHiroshi Yamauchi            // The test failed here. To avoid potential OOME during println,
70e2b6997f7e7112af6acfbf4f7184aa70dfad97ffHiroshi Yamauchi            // make holder unreachable.
71e2b6997f7e7112af6acfbf4f7184aa70dfad97ffHiroshi Yamauchi            holder = null;
723ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski            System.out.println("NEW_INSTANCE (finalize) did not throw OOME");
733ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        }
743ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski
75e2b6997f7e7112af6acfbf4f7184aa70dfad97ffHiroshi Yamauchi        // Make holder unreachable here so that the Sentinel
76e2b6997f7e7112af6acfbf4f7184aa70dfad97ffHiroshi Yamauchi        // allocation in runFinalization() won't fail.
77e2b6997f7e7112af6acfbf4f7184aa70dfad97ffHiroshi Yamauchi        holder = null;
783ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski        System.runFinalization();
793ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski    }
803ac90da48e9cd56eb4b392c7f176e9267d146500Pavel Vyssotski}
81