1 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 ; 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 v = new Vector (); 23 private int lastCall; 24 private boolean lastIsBelowThreshold = false; 25 private Vector errors = new Vector (); 26 27 public void test() throws Throwable { 28 TCMemoryManager mm = new TCMemoryManagerImpl(usedThreshold, usedCriticalThreshold, sleepInterval, lc, true); 29 mm.registerForMemoryEvents(this); 30 try { 31 hogMemory(); 32 } catch (Throwable 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 t = (Throwable ) errors.get(0); 43 throw t; 44 } 45 } 46 47 private void printStats() { 48 System.err.println("Vector size = " + v.size()); 49 Runtime 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 ("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 (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 ("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 ("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 ("Recd two callbacks with same value (" + usedPercentage + ")")); 98 } else if (Math.abs(this.lastCall - usedPercentage) < lc) { 99 errors.add(new AssertionError ("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 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 |