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