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