java/cewolf-1.0/src/main/java/de/laures/cewolf/storage/SessionStorageGroup.java
author František Kučera <franta-hg@frantovo.cz>
Sat, 28 Feb 2009 21:31:02 +0100
changeset 1 639991d0808a
permissions -rw-r--r--
Rozbalená knihovna verze 1.0
     1 /*
     2  * Created on Aug 3, 2004
     3  *
     4  * To change the template for this generated file go to
     5  * Window - Preferences - Java - Code Generation - Code and Comments
     6  */
     7 package de.laures.cewolf.storage;
     8 
     9 import java.util.Calendar;
    10 import java.util.Collection;
    11 import java.util.Date;
    12 import java.util.GregorianCalendar;
    13 import java.util.HashMap;
    14 import java.util.Iterator;
    15 import java.util.Map;
    16 
    17 /**
    18  * @author brianf
    19  * 
    20  * To change the template for this generated type comment go to Window -
    21  * Preferences - Java - Code Generation - Code and Comments
    22  */
    23 public class SessionStorageGroup implements Runnable
    24 {
    25   private Map map = new HashMap();
    26   Thread      runner;
    27 
    28   private void start()
    29   {
    30     if ( runner == null || !runner.isAlive() )
    31     {
    32       runner = new Thread(this);
    33       runner.setDaemon(false);
    34       runner.setName("SessionCleanup");
    35       runner.setPriority(Thread.MIN_PRIORITY);
    36       runner.start();
    37     }
    38   }
    39 
    40   public synchronized Object get( Object a )
    41   {
    42     return map.get(a);
    43   }
    44 
    45   public synchronized Object put( Object a, Object b )
    46   {
    47     Object c = map.put(a, b);
    48     start();
    49     return c;
    50   }
    51 
    52   public synchronized Object remove( Object a )
    53   {
    54     return map.remove(a);
    55   }
    56   /*
    57    * (non-Javadoc)
    58    * 
    59    * @see java.lang.Runnable#run()
    60    */
    61   public void run()
    62   {
    63     while ( !map.isEmpty() )
    64     {
    65       Date date = new Date();
    66       synchronized (this)
    67       {
    68         Collection keys = map.keySet();
    69 
    70         Iterator iter = keys.iterator();
    71 
    72         while ( iter.hasNext() )
    73         {
    74           // System.out.println("Get Next");
    75           String cid = (String) iter.next();
    76           SessionStorageItem ssi = (SessionStorageItem) get(cid);
    77           if ( ssi.isExpired(date) )
    78           {
    79            // System.out.println("Removing " + ssi);
    80             iter.remove();
    81           }
    82         }
    83       }
    84       try
    85       {
    86         //System.gc();
    87         Thread.sleep(1000);
    88       }
    89       catch (InterruptedException e)
    90       {
    91         // TODO Auto-generated catch block
    92         e.printStackTrace();
    93       }
    94     }
    95    // System.out.println("Exiting Thread");   
    96   }
    97   public static void main( String[] args )
    98   {
    99     int start = 0;
   100    while(true)
   101     {
   102       System.out.println("Adding Objects");
   103     testThread(start);
   104     
   105     try
   106     {
   107       Thread.sleep(10000);
   108     }
   109     catch (InterruptedException e)
   110     {
   111       // TODO Auto-generated catch block
   112       e.printStackTrace();
   113     }
   114     }
   115   }
   116 
   117   public static void testThread(int start)
   118   {
   119     SessionStorageGroup ssg = new SessionStorageGroup();
   120     Calendar cal = new GregorianCalendar();
   121     cal.setTime(new Date());
   122     //   some huge garbage string
   123   
   124     for (int i = start; i < start+10000; i++)
   125     {
   126       cal.add(Calendar.MILLISECOND, 1);
   127       SessionStorageItem ssi = new SessionStorageItem(null, Integer.toString(i), cal.getTime());
   128       ssg.put(Integer.toString(i), ssi);
   129     }
   130 
   131 
   132   }
   133   /**
   134    * Test that memory is freed up when low on it...
   135    */
   136   public static void testSoftreferenceMemoryFreeup()
   137   {
   138     Date neverexpire = new Date(10000, 1, 1);
   139     SessionStorageGroup ssg = new SessionStorageGroup();
   140 
   141     //   some huge garbage string
   142     StringBuffer longString = new StringBuffer();
   143     for (int i = 0; i < 10000; i++)
   144     {
   145       longString.append(Math.random());
   146     }
   147 
   148     int i = 0;
   149     long minmem = Long.MAX_VALUE;
   150     while ( true )
   151     {
   152       //   let's use the id string to waste memory
   153       String key = Long.toString(System.currentTimeMillis());
   154       String id = key + longString;
   155       SessionStorageItem ssi = new SessionStorageItem(null, id, neverexpire);
   156       ssg.put(key, ssi);
   157 
   158       i++;
   159       long freemem = Runtime.getRuntime().freeMemory();
   160       long usedmem = Runtime.getRuntime().totalMemory();
   161       long maxmem = Runtime.getRuntime().maxMemory();
   162       if ( freemem < minmem )
   163       {
   164         minmem = freemem;
   165       }
   166       if ( i % 100 == 0 )
   167       {
   168         System.out.println("#" + i + ", minimum memory:" + minmem + ", freemem:" + freemem
   169             + ", usedmem:" + usedmem + ", maxmem:" + maxmem);
   170       }
   171     }
   172 
   173   }
   174 }
   175