xref: /aosp_15_r20/art/test/074-gc-thrash/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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