1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2009 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker import java.io.File; 18*795d594fSAndroid Build Coastguard Worker import java.lang.ref.WeakReference; 19*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Method; 20*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.InvocationTargetException; 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker public class Main { 23*795d594fSAndroid Build Coastguard Worker public static volatile boolean quit = false; 24*795d594fSAndroid Build Coastguard Worker public static final boolean DEBUG = false; 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker private static final boolean WRITE_HPROF_DATA = false; 27*795d594fSAndroid Build Coastguard Worker private static final int TEST_TIME = 10; 28*795d594fSAndroid Build Coastguard Worker private static final String OUTPUT_FILE = "gc-thrash.hprof"; 29*795d594fSAndroid Build Coastguard Worker main(String[] args)30*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 31*795d594fSAndroid Build Coastguard Worker // dump heap before 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker System.out.println("Running (" + TEST_TIME + " seconds) ..."); 34*795d594fSAndroid Build Coastguard Worker runTests(); 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker Method dumpHprofDataMethod = null; 37*795d594fSAndroid Build Coastguard Worker String dumpFile = null; 38*795d594fSAndroid Build Coastguard Worker 39*795d594fSAndroid Build Coastguard Worker if (WRITE_HPROF_DATA) { 40*795d594fSAndroid Build Coastguard Worker dumpHprofDataMethod = getDumpHprofDataMethod(); 41*795d594fSAndroid Build Coastguard Worker if (dumpHprofDataMethod != null) { 42*795d594fSAndroid Build Coastguard Worker dumpFile = getDumpFileName(); 43*795d594fSAndroid Build Coastguard Worker System.out.println("Sending output to " + dumpFile); 44*795d594fSAndroid Build Coastguard Worker } 45*795d594fSAndroid Build Coastguard Worker } 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker System.gc(); 48*795d594fSAndroid Build Coastguard Worker System.runFinalization(); 49*795d594fSAndroid Build Coastguard Worker System.gc(); 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker if (WRITE_HPROF_DATA && dumpHprofDataMethod != null) { 52*795d594fSAndroid Build Coastguard Worker try { 53*795d594fSAndroid Build Coastguard Worker dumpHprofDataMethod.invoke(null, dumpFile); 54*795d594fSAndroid Build Coastguard Worker } catch (IllegalAccessException iae) { 55*795d594fSAndroid Build Coastguard Worker System.out.println(iae); 56*795d594fSAndroid Build Coastguard Worker } catch (InvocationTargetException ite) { 57*795d594fSAndroid Build Coastguard Worker System.out.println(ite); 58*795d594fSAndroid Build Coastguard Worker } 59*795d594fSAndroid Build Coastguard Worker } 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Worker System.out.println("Done."); 62*795d594fSAndroid Build Coastguard Worker } 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker /** 65*795d594fSAndroid Build Coastguard Worker * Finds VMDebug.dumpHprofData() through reflection. In the reference 66*795d594fSAndroid Build Coastguard Worker * implementation this will not be available. 67*795d594fSAndroid Build Coastguard Worker * 68*795d594fSAndroid Build Coastguard Worker * @return the reflection object, or null if the method can't be found 69*795d594fSAndroid Build Coastguard Worker */ getDumpHprofDataMethod()70*795d594fSAndroid Build Coastguard Worker private static Method getDumpHprofDataMethod() { 71*795d594fSAndroid Build Coastguard Worker ClassLoader myLoader = Main.class.getClassLoader(); 72*795d594fSAndroid Build Coastguard Worker Class<?> vmdClass; 73*795d594fSAndroid Build Coastguard Worker try { 74*795d594fSAndroid Build Coastguard Worker vmdClass = myLoader.loadClass("dalvik.system.VMDebug"); 75*795d594fSAndroid Build Coastguard Worker } catch (ClassNotFoundException cnfe) { 76*795d594fSAndroid Build Coastguard Worker return null; 77*795d594fSAndroid Build Coastguard Worker } 78*795d594fSAndroid Build Coastguard Worker 79*795d594fSAndroid Build Coastguard Worker Method meth; 80*795d594fSAndroid Build Coastguard Worker try { 81*795d594fSAndroid Build Coastguard Worker meth = vmdClass.getMethod("dumpHprofData", String.class); 82*795d594fSAndroid Build Coastguard Worker } catch (NoSuchMethodException nsme) { 83*795d594fSAndroid Build Coastguard Worker System.out.println("Found VMDebug but not dumpHprofData method"); 84*795d594fSAndroid Build Coastguard Worker return null; 85*795d594fSAndroid Build Coastguard Worker } 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker return meth; 88*795d594fSAndroid Build Coastguard Worker } 89*795d594fSAndroid Build Coastguard Worker getDumpFileName()90*795d594fSAndroid Build Coastguard Worker private static String getDumpFileName() { 91*795d594fSAndroid Build Coastguard Worker File tmpDir = new File("/tmp"); 92*795d594fSAndroid Build Coastguard Worker if (tmpDir.exists() && tmpDir.isDirectory()) { 93*795d594fSAndroid Build Coastguard Worker return "/tmp/" + OUTPUT_FILE; 94*795d594fSAndroid Build Coastguard Worker } 95*795d594fSAndroid Build Coastguard Worker 96*795d594fSAndroid Build Coastguard Worker File sdcard = new File("/sdcard"); 97*795d594fSAndroid Build Coastguard Worker if (sdcard.exists() && sdcard.isDirectory()) { 98*795d594fSAndroid Build Coastguard Worker return "/sdcard/" + OUTPUT_FILE; 99*795d594fSAndroid Build Coastguard Worker } 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard Worker return null; 102*795d594fSAndroid Build Coastguard Worker } 103*795d594fSAndroid Build Coastguard Worker 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker /** 106*795d594fSAndroid Build Coastguard Worker * Run the various tests for a set period. 107*795d594fSAndroid Build Coastguard Worker */ runTests()108*795d594fSAndroid Build Coastguard Worker public static void runTests() { 109*795d594fSAndroid Build Coastguard Worker Robin robin = new Robin(); 110*795d594fSAndroid Build Coastguard Worker Deep deep = new Deep(); 111*795d594fSAndroid Build Coastguard Worker Large large = new Large(); 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker /* start all threads */ 114*795d594fSAndroid Build Coastguard Worker robin.start(); 115*795d594fSAndroid Build Coastguard Worker deep.start(); 116*795d594fSAndroid Build Coastguard Worker large.start(); 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker /* let everybody run for 10 seconds */ 119*795d594fSAndroid Build Coastguard Worker sleep(TEST_TIME * 1000); 120*795d594fSAndroid Build Coastguard Worker 121*795d594fSAndroid Build Coastguard Worker quit = true; 122*795d594fSAndroid Build Coastguard Worker 123*795d594fSAndroid Build Coastguard Worker try { 124*795d594fSAndroid Build Coastguard Worker /* wait for all threads to stop */ 125*795d594fSAndroid Build Coastguard Worker robin.join(); 126*795d594fSAndroid Build Coastguard Worker deep.join(); 127*795d594fSAndroid Build Coastguard Worker large.join(); 128*795d594fSAndroid Build Coastguard Worker } catch (InterruptedException ie) { 129*795d594fSAndroid Build Coastguard Worker System.out.println("join was interrupted"); 130*795d594fSAndroid Build Coastguard Worker } 131*795d594fSAndroid Build Coastguard Worker } 132*795d594fSAndroid Build Coastguard Worker 133*795d594fSAndroid Build Coastguard Worker /** 134*795d594fSAndroid Build Coastguard Worker * Sleeps for the "ms" milliseconds. 135*795d594fSAndroid Build Coastguard Worker */ sleep(int ms)136*795d594fSAndroid Build Coastguard Worker public static void sleep(int ms) { 137*795d594fSAndroid Build Coastguard Worker try { 138*795d594fSAndroid Build Coastguard Worker Thread.sleep(ms); 139*795d594fSAndroid Build Coastguard Worker } catch (InterruptedException ie) { 140*795d594fSAndroid Build Coastguard Worker System.out.println("sleep was interrupted"); 141*795d594fSAndroid Build Coastguard Worker } 142*795d594fSAndroid Build Coastguard Worker } 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker /** 145*795d594fSAndroid Build Coastguard Worker * Sleeps briefly, allowing other threads some CPU time to get started. 146*795d594fSAndroid Build Coastguard Worker */ startupDelay()147*795d594fSAndroid Build Coastguard Worker public static void startupDelay() { 148*795d594fSAndroid Build Coastguard Worker sleep(500); 149*795d594fSAndroid Build Coastguard Worker } 150*795d594fSAndroid Build Coastguard Worker } 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Worker 153*795d594fSAndroid Build Coastguard Worker /** 154*795d594fSAndroid Build Coastguard Worker * Allocates useless objects and holds on to several of them. 155*795d594fSAndroid Build Coastguard Worker * 156*795d594fSAndroid Build Coastguard Worker * Uses a single large array of references, replaced repeatedly in round-robin 157*795d594fSAndroid Build Coastguard Worker * order. 158*795d594fSAndroid Build Coastguard Worker */ 159*795d594fSAndroid Build Coastguard Worker class Robin extends Thread { 160*795d594fSAndroid Build Coastguard Worker private static final int ARRAY_SIZE = 40960; 161*795d594fSAndroid Build Coastguard Worker int sleepCount = 0; 162*795d594fSAndroid Build Coastguard Worker run()163*795d594fSAndroid Build Coastguard Worker public void run() { 164*795d594fSAndroid Build Coastguard Worker Main.startupDelay(); 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker String strings[] = new String[ARRAY_SIZE]; 167*795d594fSAndroid Build Coastguard Worker int idx = 0; 168*795d594fSAndroid Build Coastguard Worker 169*795d594fSAndroid Build Coastguard Worker while (!Main.quit) { 170*795d594fSAndroid Build Coastguard Worker strings[idx] = makeString(idx); 171*795d594fSAndroid Build Coastguard Worker 172*795d594fSAndroid Build Coastguard Worker if (idx % (ARRAY_SIZE / 4) == 0) { 173*795d594fSAndroid Build Coastguard Worker Main.sleep(400); 174*795d594fSAndroid Build Coastguard Worker sleepCount++; 175*795d594fSAndroid Build Coastguard Worker } 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker idx = (idx + 1) % ARRAY_SIZE; 178*795d594fSAndroid Build Coastguard Worker } 179*795d594fSAndroid Build Coastguard Worker 180*795d594fSAndroid Build Coastguard Worker if (Main.DEBUG) 181*795d594fSAndroid Build Coastguard Worker System.out.println("Robin: sleepCount=" + sleepCount); 182*795d594fSAndroid Build Coastguard Worker } 183*795d594fSAndroid Build Coastguard Worker makeString(int val)184*795d594fSAndroid Build Coastguard Worker private String makeString(int val) { 185*795d594fSAndroid Build Coastguard Worker try { 186*795d594fSAndroid Build Coastguard Worker return new String("Robin" + val); 187*795d594fSAndroid Build Coastguard Worker } catch (OutOfMemoryError e) { 188*795d594fSAndroid Build Coastguard Worker return null; 189*795d594fSAndroid Build Coastguard Worker } 190*795d594fSAndroid Build Coastguard Worker } 191*795d594fSAndroid Build Coastguard Worker } 192*795d594fSAndroid Build Coastguard Worker 193*795d594fSAndroid Build Coastguard Worker 194*795d594fSAndroid Build Coastguard Worker /** 195*795d594fSAndroid Build Coastguard Worker * Allocates useless objects in recursive calls. 196*795d594fSAndroid Build Coastguard Worker */ 197*795d594fSAndroid Build Coastguard Worker class Deep extends Thread { 198*795d594fSAndroid Build Coastguard Worker private static final int MAX_DEPTH = 50; 199*795d594fSAndroid Build Coastguard Worker 200*795d594fSAndroid Build Coastguard Worker private static String strong[] = new String[MAX_DEPTH]; 201*795d594fSAndroid Build Coastguard Worker private static WeakReference weak[] = new WeakReference[MAX_DEPTH]; 202*795d594fSAndroid Build Coastguard Worker run()203*795d594fSAndroid Build Coastguard Worker public void run() { 204*795d594fSAndroid Build Coastguard Worker int iter = 0; 205*795d594fSAndroid Build Coastguard Worker boolean once = false; 206*795d594fSAndroid Build Coastguard Worker 207*795d594fSAndroid Build Coastguard Worker Main.startupDelay(); 208*795d594fSAndroid Build Coastguard Worker 209*795d594fSAndroid Build Coastguard Worker while (!Main.quit) { 210*795d594fSAndroid Build Coastguard Worker dive(0, iter); 211*795d594fSAndroid Build Coastguard Worker once = true; 212*795d594fSAndroid Build Coastguard Worker iter += MAX_DEPTH; 213*795d594fSAndroid Build Coastguard Worker } 214*795d594fSAndroid Build Coastguard Worker 215*795d594fSAndroid Build Coastguard Worker if (!once) { 216*795d594fSAndroid Build Coastguard Worker System.out.println("not even once?"); 217*795d594fSAndroid Build Coastguard Worker return; 218*795d594fSAndroid Build Coastguard Worker } 219*795d594fSAndroid Build Coastguard Worker 220*795d594fSAndroid Build Coastguard Worker checkStringReferences(); 221*795d594fSAndroid Build Coastguard Worker 222*795d594fSAndroid Build Coastguard Worker /* 223*795d594fSAndroid Build Coastguard Worker * Wipe "strong", do a GC, see if "weak" got collected. 224*795d594fSAndroid Build Coastguard Worker */ 225*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < MAX_DEPTH; i++) 226*795d594fSAndroid Build Coastguard Worker strong[i] = null; 227*795d594fSAndroid Build Coastguard Worker 228*795d594fSAndroid Build Coastguard Worker Runtime.getRuntime().gc(); 229*795d594fSAndroid Build Coastguard Worker 230*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < MAX_DEPTH; i++) { 231*795d594fSAndroid Build Coastguard Worker if (weak[i].get() != null) { 232*795d594fSAndroid Build Coastguard Worker System.out.println("Deep: weak still has " + i); 233*795d594fSAndroid Build Coastguard Worker } 234*795d594fSAndroid Build Coastguard Worker } 235*795d594fSAndroid Build Coastguard Worker 236*795d594fSAndroid Build Coastguard Worker if (Main.DEBUG) 237*795d594fSAndroid Build Coastguard Worker System.out.println("Deep: iters=" + iter / MAX_DEPTH); 238*795d594fSAndroid Build Coastguard Worker } 239*795d594fSAndroid Build Coastguard Worker 240*795d594fSAndroid Build Coastguard Worker 241*795d594fSAndroid Build Coastguard Worker /** 242*795d594fSAndroid Build Coastguard Worker * Check the results of the last trip through. Everything in 243*795d594fSAndroid Build Coastguard Worker * "weak" should be matched in "strong", and the two should be 244*795d594fSAndroid Build Coastguard Worker * equivalent (object-wise, not just string-equality-wise). 245*795d594fSAndroid Build Coastguard Worker * 246*795d594fSAndroid Build Coastguard Worker * We do that check in a separate method to avoid retaining these 247*795d594fSAndroid Build Coastguard Worker * String references in local DEX registers. In interpreter mode, 248*795d594fSAndroid Build Coastguard Worker * they would retain these references until the end of the method 249*795d594fSAndroid Build Coastguard Worker * or until they are updated to another value. 250*795d594fSAndroid Build Coastguard Worker */ checkStringReferences()251*795d594fSAndroid Build Coastguard Worker private static void checkStringReferences() { 252*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < MAX_DEPTH; i++) { 253*795d594fSAndroid Build Coastguard Worker if (strong[i] != weak[i].get()) { 254*795d594fSAndroid Build Coastguard Worker System.out.println("Deep: " + i + " strong=" + strong[i] + 255*795d594fSAndroid Build Coastguard Worker ", weak=" + weak[i].get()); 256*795d594fSAndroid Build Coastguard Worker } 257*795d594fSAndroid Build Coastguard Worker } 258*795d594fSAndroid Build Coastguard Worker } 259*795d594fSAndroid Build Coastguard Worker 260*795d594fSAndroid Build Coastguard Worker /** 261*795d594fSAndroid Build Coastguard Worker * Recursively dive down, setting one or more local variables. 262*795d594fSAndroid Build Coastguard Worker * 263*795d594fSAndroid Build Coastguard Worker * We pad the stack out with locals, attempting to create a mix of 264*795d594fSAndroid Build Coastguard Worker * valid and invalid references on the stack. 265*795d594fSAndroid Build Coastguard Worker */ dive(int depth, int iteration)266*795d594fSAndroid Build Coastguard Worker private String dive(int depth, int iteration) { 267*795d594fSAndroid Build Coastguard Worker try { 268*795d594fSAndroid Build Coastguard Worker String str0; 269*795d594fSAndroid Build Coastguard Worker String str1; 270*795d594fSAndroid Build Coastguard Worker String str2; 271*795d594fSAndroid Build Coastguard Worker String str3; 272*795d594fSAndroid Build Coastguard Worker String str4; 273*795d594fSAndroid Build Coastguard Worker String str5; 274*795d594fSAndroid Build Coastguard Worker String str6; 275*795d594fSAndroid Build Coastguard Worker String str7; 276*795d594fSAndroid Build Coastguard Worker String funStr = ""; 277*795d594fSAndroid Build Coastguard Worker switch (iteration % 8) { 278*795d594fSAndroid Build Coastguard Worker case 0: 279*795d594fSAndroid Build Coastguard Worker funStr = str0 = makeString(iteration); 280*795d594fSAndroid Build Coastguard Worker break; 281*795d594fSAndroid Build Coastguard Worker case 1: 282*795d594fSAndroid Build Coastguard Worker funStr = str1 = makeString(iteration); 283*795d594fSAndroid Build Coastguard Worker break; 284*795d594fSAndroid Build Coastguard Worker case 2: 285*795d594fSAndroid Build Coastguard Worker funStr = str2 = makeString(iteration); 286*795d594fSAndroid Build Coastguard Worker break; 287*795d594fSAndroid Build Coastguard Worker case 3: 288*795d594fSAndroid Build Coastguard Worker funStr = str3 = makeString(iteration); 289*795d594fSAndroid Build Coastguard Worker break; 290*795d594fSAndroid Build Coastguard Worker case 4: 291*795d594fSAndroid Build Coastguard Worker funStr = str4 = makeString(iteration); 292*795d594fSAndroid Build Coastguard Worker break; 293*795d594fSAndroid Build Coastguard Worker case 5: 294*795d594fSAndroid Build Coastguard Worker funStr = str5 = makeString(iteration); 295*795d594fSAndroid Build Coastguard Worker break; 296*795d594fSAndroid Build Coastguard Worker case 6: 297*795d594fSAndroid Build Coastguard Worker funStr = str6 = makeString(iteration); 298*795d594fSAndroid Build Coastguard Worker break; 299*795d594fSAndroid Build Coastguard Worker case 7: 300*795d594fSAndroid Build Coastguard Worker funStr = str7 = makeString(iteration); 301*795d594fSAndroid Build Coastguard Worker break; 302*795d594fSAndroid Build Coastguard Worker } 303*795d594fSAndroid Build Coastguard Worker 304*795d594fSAndroid Build Coastguard Worker weak[depth] = new WeakReference(funStr); 305*795d594fSAndroid Build Coastguard Worker strong[depth] = funStr; 306*795d594fSAndroid Build Coastguard Worker if (depth+1 < MAX_DEPTH) 307*795d594fSAndroid Build Coastguard Worker dive(depth+1, iteration+1); 308*795d594fSAndroid Build Coastguard Worker else 309*795d594fSAndroid Build Coastguard Worker Main.sleep(100); 310*795d594fSAndroid Build Coastguard Worker return funStr; 311*795d594fSAndroid Build Coastguard Worker } catch (OutOfMemoryError e) { 312*795d594fSAndroid Build Coastguard Worker // Silently ignore OOME since gc stress mode causes them to occur but shouldn't be a 313*795d594fSAndroid Build Coastguard Worker // test failure. 314*795d594fSAndroid Build Coastguard Worker } 315*795d594fSAndroid Build Coastguard Worker return ""; 316*795d594fSAndroid Build Coastguard Worker } 317*795d594fSAndroid Build Coastguard Worker makeString(int val)318*795d594fSAndroid Build Coastguard Worker private String makeString(int val) { 319*795d594fSAndroid Build Coastguard Worker try { 320*795d594fSAndroid Build Coastguard Worker return new String("Deep" + val); 321*795d594fSAndroid Build Coastguard Worker } catch (OutOfMemoryError e) { 322*795d594fSAndroid Build Coastguard Worker return null; 323*795d594fSAndroid Build Coastguard Worker } 324*795d594fSAndroid Build Coastguard Worker } 325*795d594fSAndroid Build Coastguard Worker } 326*795d594fSAndroid Build Coastguard Worker 327*795d594fSAndroid Build Coastguard Worker 328*795d594fSAndroid Build Coastguard Worker /** 329*795d594fSAndroid Build Coastguard Worker * Allocates large useless objects. 330*795d594fSAndroid Build Coastguard Worker */ 331*795d594fSAndroid Build Coastguard Worker class Large extends Thread { run()332*795d594fSAndroid Build Coastguard Worker public void run() { 333*795d594fSAndroid Build Coastguard Worker byte[] chunk; 334*795d594fSAndroid Build Coastguard Worker int count = 0; 335*795d594fSAndroid Build Coastguard Worker int sleepCount = 0; 336*795d594fSAndroid Build Coastguard Worker 337*795d594fSAndroid Build Coastguard Worker Main.startupDelay(); 338*795d594fSAndroid Build Coastguard Worker 339*795d594fSAndroid Build Coastguard Worker while (!Main.quit) { 340*795d594fSAndroid Build Coastguard Worker try { 341*795d594fSAndroid Build Coastguard Worker chunk = new byte[100000]; 342*795d594fSAndroid Build Coastguard Worker pretendToUse(chunk); 343*795d594fSAndroid Build Coastguard Worker 344*795d594fSAndroid Build Coastguard Worker count++; 345*795d594fSAndroid Build Coastguard Worker if ((count % 500) == 0) { 346*795d594fSAndroid Build Coastguard Worker Main.sleep(400); 347*795d594fSAndroid Build Coastguard Worker sleepCount++; 348*795d594fSAndroid Build Coastguard Worker } 349*795d594fSAndroid Build Coastguard Worker } catch (OutOfMemoryError e) { 350*795d594fSAndroid Build Coastguard Worker } 351*795d594fSAndroid Build Coastguard Worker } 352*795d594fSAndroid Build Coastguard Worker 353*795d594fSAndroid Build Coastguard Worker if (Main.DEBUG) 354*795d594fSAndroid Build Coastguard Worker System.out.println("Large: sleepCount=" + sleepCount); 355*795d594fSAndroid Build Coastguard Worker } 356*795d594fSAndroid Build Coastguard Worker pretendToUse(byte[] chunk)357*795d594fSAndroid Build Coastguard Worker public void pretendToUse(byte[] chunk) {} 358*795d594fSAndroid Build Coastguard Worker } 359