KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > daffodilwoods > database > general > MemoryManager


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 JavaDoc memory_manager_listeners;
10
11   Thread JavaDoc load_shedder = new Thread JavaDoc(
12     new Runnable JavaDoc() {
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 JavaDoc ex) {
33            }
34          }
35       }
36     }
37   );
38
39
40   public double get_size() throws DException {
41      double total_size = 0;
42      Object JavaDoc[] weakReferences = memory_manager_listeners.toArray() ;
43      for( int i = 0; i < weakReferences.length ; i++){
44          WeakReference wk = (WeakReference)weakReferences[i];
45          Object JavaDoc 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 JavaDoc[] weakReferences = memory_manager_listeners.toArray() ;
56      for( int i = 0; i < weakReferences.length ; i++){
57          WeakReference wk = (WeakReference)weakReferences[i];
58          Object JavaDoc 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 JavaDoc(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 JavaDoc[] weakReferences = memory_manager_listeners.toArray() ;
80      for( int i = 0; i < weakReferences.length ; i++){
81          WeakReference wk = (WeakReference)weakReferences[i];
82          Object JavaDoc 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