franta-hg@1: /* franta-hg@1: * Created on Aug 3, 2004 franta-hg@1: * franta-hg@1: * To change the template for this generated file go to franta-hg@1: * Window - Preferences - Java - Code Generation - Code and Comments franta-hg@1: */ franta-hg@1: package de.laures.cewolf.storage; franta-hg@1: franta-hg@1: import java.util.Calendar; franta-hg@1: import java.util.Collection; franta-hg@1: import java.util.Date; franta-hg@1: import java.util.GregorianCalendar; franta-hg@1: import java.util.HashMap; franta-hg@1: import java.util.Iterator; franta-hg@1: import java.util.Map; franta-hg@1: franta-hg@1: /** franta-hg@1: * @author brianf franta-hg@1: * franta-hg@1: * To change the template for this generated type comment go to Window - franta-hg@1: * Preferences - Java - Code Generation - Code and Comments franta-hg@1: */ franta-hg@1: public class SessionStorageGroup implements Runnable franta-hg@1: { franta-hg@1: private Map map = new HashMap(); franta-hg@1: Thread runner; franta-hg@1: franta-hg@1: private void start() franta-hg@1: { franta-hg@1: if ( runner == null || !runner.isAlive() ) franta-hg@1: { franta-hg@1: runner = new Thread(this); franta-hg@1: runner.setDaemon(false); franta-hg@1: runner.setName("SessionCleanup"); franta-hg@1: runner.setPriority(Thread.MIN_PRIORITY); franta-hg@1: runner.start(); franta-hg@1: } franta-hg@1: } franta-hg@1: franta-hg@1: public synchronized Object get( Object a ) franta-hg@1: { franta-hg@1: return map.get(a); franta-hg@1: } franta-hg@1: franta-hg@1: public synchronized Object put( Object a, Object b ) franta-hg@1: { franta-hg@1: Object c = map.put(a, b); franta-hg@1: start(); franta-hg@1: return c; franta-hg@1: } franta-hg@1: franta-hg@1: public synchronized Object remove( Object a ) franta-hg@1: { franta-hg@1: return map.remove(a); franta-hg@1: } franta-hg@1: /* franta-hg@1: * (non-Javadoc) franta-hg@1: * franta-hg@1: * @see java.lang.Runnable#run() franta-hg@1: */ franta-hg@1: public void run() franta-hg@1: { franta-hg@1: while ( !map.isEmpty() ) franta-hg@1: { franta-hg@1: Date date = new Date(); franta-hg@1: synchronized (this) franta-hg@1: { franta-hg@1: Collection keys = map.keySet(); franta-hg@1: franta-hg@1: Iterator iter = keys.iterator(); franta-hg@1: franta-hg@1: while ( iter.hasNext() ) franta-hg@1: { franta-hg@1: // System.out.println("Get Next"); franta-hg@1: String cid = (String) iter.next(); franta-hg@1: SessionStorageItem ssi = (SessionStorageItem) get(cid); franta-hg@1: if ( ssi.isExpired(date) ) franta-hg@1: { franta-hg@1: // System.out.println("Removing " + ssi); franta-hg@1: iter.remove(); franta-hg@1: } franta-hg@1: } franta-hg@1: } franta-hg@1: try franta-hg@1: { franta-hg@1: //System.gc(); franta-hg@1: Thread.sleep(1000); franta-hg@1: } franta-hg@1: catch (InterruptedException e) franta-hg@1: { franta-hg@1: // TODO Auto-generated catch block franta-hg@1: e.printStackTrace(); franta-hg@1: } franta-hg@1: } franta-hg@1: // System.out.println("Exiting Thread"); franta-hg@1: } franta-hg@1: public static void main( String[] args ) franta-hg@1: { franta-hg@1: int start = 0; franta-hg@1: while(true) franta-hg@1: { franta-hg@1: System.out.println("Adding Objects"); franta-hg@1: testThread(start); franta-hg@1: franta-hg@1: try franta-hg@1: { franta-hg@1: Thread.sleep(10000); franta-hg@1: } franta-hg@1: catch (InterruptedException e) franta-hg@1: { franta-hg@1: // TODO Auto-generated catch block franta-hg@1: e.printStackTrace(); franta-hg@1: } franta-hg@1: } franta-hg@1: } franta-hg@1: franta-hg@1: public static void testThread(int start) franta-hg@1: { franta-hg@1: SessionStorageGroup ssg = new SessionStorageGroup(); franta-hg@1: Calendar cal = new GregorianCalendar(); franta-hg@1: cal.setTime(new Date()); franta-hg@1: // some huge garbage string franta-hg@1: franta-hg@1: for (int i = start; i < start+10000; i++) franta-hg@1: { franta-hg@1: cal.add(Calendar.MILLISECOND, 1); franta-hg@1: SessionStorageItem ssi = new SessionStorageItem(null, Integer.toString(i), cal.getTime()); franta-hg@1: ssg.put(Integer.toString(i), ssi); franta-hg@1: } franta-hg@1: franta-hg@1: franta-hg@1: } franta-hg@1: /** franta-hg@1: * Test that memory is freed up when low on it... franta-hg@1: */ franta-hg@1: public static void testSoftreferenceMemoryFreeup() franta-hg@1: { franta-hg@1: Date neverexpire = new Date(10000, 1, 1); franta-hg@1: SessionStorageGroup ssg = new SessionStorageGroup(); franta-hg@1: franta-hg@1: // some huge garbage string franta-hg@1: StringBuffer longString = new StringBuffer(); franta-hg@1: for (int i = 0; i < 10000; i++) franta-hg@1: { franta-hg@1: longString.append(Math.random()); franta-hg@1: } franta-hg@1: franta-hg@1: int i = 0; franta-hg@1: long minmem = Long.MAX_VALUE; franta-hg@1: while ( true ) franta-hg@1: { franta-hg@1: // let's use the id string to waste memory franta-hg@1: String key = Long.toString(System.currentTimeMillis()); franta-hg@1: String id = key + longString; franta-hg@1: SessionStorageItem ssi = new SessionStorageItem(null, id, neverexpire); franta-hg@1: ssg.put(key, ssi); franta-hg@1: franta-hg@1: i++; franta-hg@1: long freemem = Runtime.getRuntime().freeMemory(); franta-hg@1: long usedmem = Runtime.getRuntime().totalMemory(); franta-hg@1: long maxmem = Runtime.getRuntime().maxMemory(); franta-hg@1: if ( freemem < minmem ) franta-hg@1: { franta-hg@1: minmem = freemem; franta-hg@1: } franta-hg@1: if ( i % 100 == 0 ) franta-hg@1: { franta-hg@1: System.out.println("#" + i + ", minimum memory:" + minmem + ", freemem:" + freemem franta-hg@1: + ", usedmem:" + usedmem + ", maxmem:" + maxmem); franta-hg@1: } franta-hg@1: } franta-hg@1: franta-hg@1: } franta-hg@1: } franta-hg@1: