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