KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > runtime > TCMemoryManagerImplTest


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright
3  * notice. All rights reserved.
4  */

5 package com.tc.runtime;
6
7 import EDU.oswego.cs.dl.util.concurrent.SynchronizedInt;
8
9 import com.tc.test.TCTestCase;
10 import com.tc.util.concurrent.ThreadUtil;
11
12 import java.util.Vector JavaDoc;
13
14 public class TCMemoryManagerImplTest extends TCTestCase implements MemoryEventsListener {
15
16   int usedThreshold = 70;
17   int usedCriticalThreshold = 90;
18   long sleepInterval = 50;
19   int lc = 2;
20   SynchronizedInt callCount = new SynchronizedInt(0);
21
22   Vector JavaDoc v = new Vector JavaDoc();
23   private int lastCall;
24   private boolean lastIsBelowThreshold = false;
25   private Vector JavaDoc errors = new Vector JavaDoc();
26
27   public void test() throws Throwable JavaDoc {
28     TCMemoryManager mm = new TCMemoryManagerImpl(usedThreshold, usedCriticalThreshold, sleepInterval, lc, true);
29     mm.registerForMemoryEvents(this);
30     try {
31       hogMemory();
32     } catch (Throwable JavaDoc e) {
33       System.err.println("Got Exception : " + e);
34       printStats();
35       e.printStackTrace();
36       throw e;
37     }
38     assertTrue(callCount.get() > 0);
39     if (errors.size() > 0) {
40       System.err.println("Errors present in the run : " + errors.size());
41       System.err.println("Errors = " + errors);
42       Throwable JavaDoc t = (Throwable JavaDoc) errors.get(0);
43       throw t;
44     }
45   }
46
47   private void printStats() {
48     System.err.println("Vector size = " + v.size());
49     Runtime JavaDoc r = Runtime.getRuntime();
50     System.err.println("Memory details = Max = " + r.maxMemory() + " Free =" + r.freeMemory());
51   }
52
53   private void hogMemory() {
54     for (int i = 1; i < 500000; i++) {
55       byte[] b = new byte[10240];
56       v.add(b);
57       if (i % 10000 == 0) {
58         System.err.println("Created " + i + " byte arrays - currently in vector = " + v.size());
59       }
60       if (i % 50 == 0) {
61         ThreadUtil.reallySleep(1);
62       }
63     }
64   }
65
66   public void memoryUsed(MemoryEventType type, MemoryUsage usage) {
67     int usedPercentage = usage.getUsedPercentage();
68     if (callCount.increment() % 10 == 1 || type == MemoryEventType.ABOVE_CRITICAL_THRESHOLD) {
69       System.err.println("Current used memory % : " + usedPercentage + " vector size = " + v.size());
70     }
71
72     if (this.usedThreshold > usedPercentage) {
73       if (type != MemoryEventType.BELOW_THRESHOLD) {
74         errors.add(new AssertionError JavaDoc("Used Percentage reported (" + usedPercentage + ") is less than Used threshold ("
75                                       + usedThreshold + ") set, but type is " + type));
76       } else if (lastIsBelowThreshold) {
77         errors.add(new AssertionError JavaDoc(type + " is reported more often than it should be. Used % is " + usedPercentage));
78       }
79       lastIsBelowThreshold = true;
80       this.lastCall = 0;
81     } else {
82       lastIsBelowThreshold = false;
83     }
84
85     if (type == MemoryEventType.ABOVE_CRITICAL_THRESHOLD && this.usedCriticalThreshold > usedPercentage) {
86       errors.add(new AssertionError JavaDoc("Received CRITICAL event with used < critical threshold : " + usedPercentage
87                                     + " < " + this.usedCriticalThreshold));
88     } else if (type == MemoryEventType.ABOVE_THRESHOLD && this.usedCriticalThreshold < usedPercentage) {
89       errors.add(new AssertionError JavaDoc("Received NORMAL event with used > critical threshold : " + usedPercentage + " > "
90                                     + this.usedCriticalThreshold));
91     } else {
92       this.lastCall = 0;
93     }
94
95     if (type == MemoryEventType.ABOVE_THRESHOLD) {
96       if (this.lastCall == usedPercentage) {
97         errors.add(new AssertionError JavaDoc("Recd two callbacks with same value (" + usedPercentage + ")"));
98       } else if (Math.abs(this.lastCall - usedPercentage) < lc) {
99         errors.add(new AssertionError JavaDoc("Recd two callbacks with values less that least count (" + usedPercentage
100                                       + " , " + lastCall + ") - LC = " + lc));
101       }
102       this.lastCall = usedPercentage;
103     }
104     releaseSomeMemory(usedPercentage);
105   }
106
107   // Releases 10 % of the elements in the vector for 70 % used
108
private void releaseSomeMemory(int used) {
109     if (used < usedThreshold) {
110       return;
111     } else if (used > 90) {
112       v.clear();
113       return;
114     }
115     int percentToDelete = (100 - used) * 4;
116     synchronized (v) {
117       int toRemove = Math.min(v.size() * percentToDelete / 100, v.size());
118       for (int i = 0; i < toRemove; i++) {
119         v.remove(v.size() - 1);
120       }
121     }
122   }
123
124 }
125
Popular Tags