14f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng/*
24f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * Copyright (C) 2009 The Android Open Source Project
34f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng *
44f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * Licensed under the Apache License, Version 2.0 (the "License");
54f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * you may not use this file except in compliance with the License.
64f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * You may obtain a copy of the License at
74f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng *
84f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng *      http://www.apache.org/licenses/LICENSE-2.0
94f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng *
104f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * Unless required by applicable law or agreed to in writing, software
114f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * distributed under the License is distributed on an "AS IS" BASIS,
124f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * See the License for the specific language governing permissions and
144f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng * limitations under the License.
154f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng */
164f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
174f48917c0741e4d9b15ca7c45956aea05fea103fBen Chengpublic class Main {
184f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    static class ArrayMemEater {
194f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        static int blowup(char[][] holder, int size) {
204f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            int i = 0;
214f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            try {
224f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng                for ( ; i < size; i++)
234f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng                    holder[i] = new char[128];
244f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            } catch (OutOfMemoryError oome) {
254f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng                return i;
264f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            }
274f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
284f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            return size;
294f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        }
304f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
314f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        static void confuseCompilerOptimization(char[][] holder) {
324f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        }
334f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    }
344f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
354f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    static class InstanceMemEater {
364f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        InstanceMemEater next;
374f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        double d1, d2, d3, d4, d5, d6, d7, d8;
384f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
394f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        static InstanceMemEater blowup() {
404f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            InstanceMemEater memEater;
414f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            try {
424f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng                memEater = new InstanceMemEater();
434f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            } catch (OutOfMemoryError e) {
444f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng                memEater = null;
454f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            }
464f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            return memEater;
474f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        }
484f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
494f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        static void confuseCompilerOptimization(InstanceMemEater memEater) {
504f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        }
514f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    }
524f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
534f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    static void triggerArrayOOM() {
544f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        int size = 1 * 1024 * 1024;
554f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        char[][] holder = new char[size][];
564f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
574f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        int count = ArrayMemEater.blowup(holder, size);
584f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        ArrayMemEater.confuseCompilerOptimization(holder);
594f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        if (count < size) {
604f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            System.out.println("Array allocation failed");
614f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        }
624f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    }
634f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
644f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    static void triggerInstanceOOM() {
654f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        InstanceMemEater memEater = InstanceMemEater.blowup();
664f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        InstanceMemEater lastMemEater = memEater;
674f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        do {
684f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            lastMemEater.next = InstanceMemEater.blowup();
694f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng            lastMemEater = lastMemEater.next;
704f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        } while (lastMemEater != null);
714f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        memEater.confuseCompilerOptimization(memEater);
724f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        System.out.println("Instance allocation failed");
734f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    }
744f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng
754f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    public static void main(String[] args) {
764f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        triggerArrayOOM();
774f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng        triggerInstanceOOM();
784f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng    }
794f48917c0741e4d9b15ca7c45956aea05fea103fBen Cheng}
80