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 |
|