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 +