java/cewolf-1.0/src/main/java/de/laures/cewolf/storage/SessionStorageGroup.java
changeset 1 639991d0808a
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/java/cewolf-1.0/src/main/java/de/laures/cewolf/storage/SessionStorageGroup.java	Sat Feb 28 21:31:02 2009 +0100
     1.3 @@ -0,0 +1,175 @@
     1.4 +/*
     1.5 + * Created on Aug 3, 2004
     1.6 + *
     1.7 + * To change the template for this generated file go to
     1.8 + * Window - Preferences - Java - Code Generation - Code and Comments
     1.9 + */
    1.10 +package de.laures.cewolf.storage;
    1.11 +
    1.12 +import java.util.Calendar;
    1.13 +import java.util.Collection;
    1.14 +import java.util.Date;
    1.15 +import java.util.GregorianCalendar;
    1.16 +import java.util.HashMap;
    1.17 +import java.util.Iterator;
    1.18 +import java.util.Map;
    1.19 +
    1.20 +/**
    1.21 + * @author brianf
    1.22 + * 
    1.23 + * To change the template for this generated type comment go to Window -
    1.24 + * Preferences - Java - Code Generation - Code and Comments
    1.25 + */
    1.26 +public class SessionStorageGroup implements Runnable
    1.27 +{
    1.28 +  private Map map = new HashMap();
    1.29 +  Thread      runner;
    1.30 +
    1.31 +  private void start()
    1.32 +  {
    1.33 +    if ( runner == null || !runner.isAlive() )
    1.34 +    {
    1.35 +      runner = new Thread(this);
    1.36 +      runner.setDaemon(false);
    1.37 +      runner.setName("SessionCleanup");
    1.38 +      runner.setPriority(Thread.MIN_PRIORITY);
    1.39 +      runner.start();
    1.40 +    }
    1.41 +  }
    1.42 +
    1.43 +  public synchronized Object get( Object a )
    1.44 +  {
    1.45 +    return map.get(a);
    1.46 +  }
    1.47 +
    1.48 +  public synchronized Object put( Object a, Object b )
    1.49 +  {
    1.50 +    Object c = map.put(a, b);
    1.51 +    start();
    1.52 +    return c;
    1.53 +  }
    1.54 +
    1.55 +  public synchronized Object remove( Object a )
    1.56 +  {
    1.57 +    return map.remove(a);
    1.58 +  }
    1.59 +  /*
    1.60 +   * (non-Javadoc)
    1.61 +   * 
    1.62 +   * @see java.lang.Runnable#run()
    1.63 +   */
    1.64 +  public void run()
    1.65 +  {
    1.66 +    while ( !map.isEmpty() )
    1.67 +    {
    1.68 +      Date date = new Date();
    1.69 +      synchronized (this)
    1.70 +      {
    1.71 +        Collection keys = map.keySet();
    1.72 +
    1.73 +        Iterator iter = keys.iterator();
    1.74 +
    1.75 +        while ( iter.hasNext() )
    1.76 +        {
    1.77 +          // System.out.println("Get Next");
    1.78 +          String cid = (String) iter.next();
    1.79 +          SessionStorageItem ssi = (SessionStorageItem) get(cid);
    1.80 +          if ( ssi.isExpired(date) )
    1.81 +          {
    1.82 +           // System.out.println("Removing " + ssi);
    1.83 +            iter.remove();
    1.84 +          }
    1.85 +        }
    1.86 +      }
    1.87 +      try
    1.88 +      {
    1.89 +        //System.gc();
    1.90 +        Thread.sleep(1000);
    1.91 +      }
    1.92 +      catch (InterruptedException e)
    1.93 +      {
    1.94 +        // TODO Auto-generated catch block
    1.95 +        e.printStackTrace();
    1.96 +      }
    1.97 +    }
    1.98 +   // System.out.println("Exiting Thread");   
    1.99 +  }
   1.100 +  public static void main( String[] args )
   1.101 +  {
   1.102 +    int start = 0;
   1.103 +   while(true)
   1.104 +    {
   1.105 +      System.out.println("Adding Objects");
   1.106 +    testThread(start);
   1.107 +    
   1.108 +    try
   1.109 +    {
   1.110 +      Thread.sleep(10000);
   1.111 +    }
   1.112 +    catch (InterruptedException e)
   1.113 +    {
   1.114 +      // TODO Auto-generated catch block
   1.115 +      e.printStackTrace();
   1.116 +    }
   1.117 +    }
   1.118 +  }
   1.119 +
   1.120 +  public static void testThread(int start)
   1.121 +  {
   1.122 +    SessionStorageGroup ssg = new SessionStorageGroup();
   1.123 +    Calendar cal = new GregorianCalendar();
   1.124 +    cal.setTime(new Date());
   1.125 +    //   some huge garbage string
   1.126 +  
   1.127 +    for (int i = start; i < start+10000; i++)
   1.128 +    {
   1.129 +      cal.add(Calendar.MILLISECOND, 1);
   1.130 +      SessionStorageItem ssi = new SessionStorageItem(null, Integer.toString(i), cal.getTime());
   1.131 +      ssg.put(Integer.toString(i), ssi);
   1.132 +    }
   1.133 +
   1.134 +
   1.135 +  }
   1.136 +  /**
   1.137 +   * Test that memory is freed up when low on it...
   1.138 +   */
   1.139 +  public static void testSoftreferenceMemoryFreeup()
   1.140 +  {
   1.141 +    Date neverexpire = new Date(10000, 1, 1);
   1.142 +    SessionStorageGroup ssg = new SessionStorageGroup();
   1.143 +
   1.144 +    //   some huge garbage string
   1.145 +    StringBuffer longString = new StringBuffer();
   1.146 +    for (int i = 0; i < 10000; i++)
   1.147 +    {
   1.148 +      longString.append(Math.random());
   1.149 +    }
   1.150 +
   1.151 +    int i = 0;
   1.152 +    long minmem = Long.MAX_VALUE;
   1.153 +    while ( true )
   1.154 +    {
   1.155 +      //   let's use the id string to waste memory
   1.156 +      String key = Long.toString(System.currentTimeMillis());
   1.157 +      String id = key + longString;
   1.158 +      SessionStorageItem ssi = new SessionStorageItem(null, id, neverexpire);
   1.159 +      ssg.put(key, ssi);
   1.160 +
   1.161 +      i++;
   1.162 +      long freemem = Runtime.getRuntime().freeMemory();
   1.163 +      long usedmem = Runtime.getRuntime().totalMemory();
   1.164 +      long maxmem = Runtime.getRuntime().maxMemory();
   1.165 +      if ( freemem < minmem )
   1.166 +      {
   1.167 +        minmem = freemem;
   1.168 +      }
   1.169 +      if ( i % 100 == 0 )
   1.170 +      {
   1.171 +        System.out.println("#" + i + ", minimum memory:" + minmem + ", freemem:" + freemem
   1.172 +            + ", usedmem:" + usedmem + ", maxmem:" + maxmem);
   1.173 +      }
   1.174 +    }
   1.175 +
   1.176 +  }
   1.177 +}
   1.178 +