1 package com.daffodilwoods.database.general; 2 3 import com.daffodilwoods.database.resource.*; 4 import java.lang.ref.*; 5 public class MemoryManager implements _MemoryManager { 6 final long SLEEP_TIME = 250; 7 final int captureMemoryFactor = 2; 8 double shed_load_limit; 9 java.util.Vector memory_manager_listeners; 10 11 Thread load_shedder = new Thread ( 12 new Runnable () { 13 public void run() { 14 while(true) { 15 try { 16 double total_size = get_size()*captureMemoryFactor; 17 int percentageMemoryUsed = (int)(total_size / shed_load_limit * 100); 18 if(percentageMemoryUsed >= 50 ) { 19 int priorityLevel = (int)(percentageMemoryUsed / 10); 20 priorityLevel = priorityLevel > 10 ? 10 : priorityLevel ; 21 double breakLimit = (total_size * percentageMemoryUsed) / 100; 22 for(int priority = 0 ; priority < priorityLevel ; priority++) { 23 shed_load(breakLimit, priority); 24 double size = get_size(); 25 if( size < shed_load_limit){ 26 Runtime.getRuntime().runFinalization(); 27 break; 28 } 29 } 30 } 31 load_shedder.sleep(SLEEP_TIME); 32 }catch(Exception ex) { 33 } 34 } 35 } 36 } 37 ); 38 39 40 public double get_size() throws DException { 41 double total_size = 0; 42 Object [] weakReferences = memory_manager_listeners.toArray() ; 43 for( int i = 0; i < weakReferences.length ; i++){ 44 WeakReference wk = (WeakReference)weakReferences[i]; 45 Object obj = wk.get(); 46 if( obj != null ) 47 total_size += ((_MemoryHandler)obj).get_size(); 48 else 49 memory_manager_listeners.remove(wk); 50 } 51 return total_size; 52 } 53 54 public void shed_load(double shed_limit, int priority) throws DException { 55 Object [] weakReferences = memory_manager_listeners.toArray() ; 56 for( int i = 0; i < weakReferences.length ; i++){ 57 WeakReference wk = (WeakReference)weakReferences[i]; 58 Object obj = wk.get(); 59 if( obj != null ) 60 ((_MemoryHandler)obj).shed_load(shed_limit,priority); 61 else 62 memory_manager_listeners.remove(wk); 63 } 64 System.gc(); 65 } 66 67 68 public MemoryManager(double shed_load_limit) throws DException { 69 this.shed_load_limit = shed_load_limit; 70 memory_manager_listeners = new java.util.Vector (5); 71 } 72 73 74 public void add(_MemoryHandler listener) throws DException { 75 } 76 77 78 public void remove(_MemoryHandler listener) throws DException { 79 Object [] weakReferences = memory_manager_listeners.toArray() ; 80 for( int i = 0; i < weakReferences.length ; i++){ 81 WeakReference wk = (WeakReference)weakReferences[i]; 82 Object obj = wk.get(); 83 if( obj != null ){ 84 if( obj.equals(listener) ) 85 memory_manager_listeners.remove(wk); 86 } 87 else 88 memory_manager_listeners.remove(wk); 89 } 90 } 91 } 92 | Popular Tags |