vgritsenko 01/08/21 20:16:40
Modified: src/org/apache/cocoon/components/store Tag: cocoon_20_branch
MRUMemoryStore.java
Log:
fixing memory leaks
Revision Changes Path
No revision
No revision
1.2.2.11 +25 -29
xml-cocoon2/src/org/apache/cocoon/components/store/MRUMemoryStore.java
Index: MRUMemoryStore.java
===================================================================
RCS file:
/home/cvs/xml-cocoon2/src/org/apache/cocoon/components/store/MRUMemoryStore.java,v
retrieving revision 1.2.2.10
retrieving revision 1.2.2.11
diff -u -r1.2.2.10 -r1.2.2.11
--- MRUMemoryStore.java 2001/08/20 19:18:46 1.2.2.10
+++ MRUMemoryStore.java 2001/08/22 03:16:40 1.2.2.11
@@ -37,7 +37,7 @@
* The objects can also be stored onto the filesystem to hold them in a
* persitent state over jvm restarts.
*
- * The idea was token from the "Writing Advanced Applikation Tutorial" from
+ * The idea was taken from the "Writing Advanced Application Tutorial" from
* javasoft. Many thanx to the writers!
*
* @author <a href="mailto:[EMAIL PROTECTED]">Gerhard Froehlich</a>
@@ -154,7 +154,6 @@
*/
public void configure(Configuration conf) throws ConfigurationException {
this.jvm = Runtime.getRuntime();
- this.cache = new HashMap(75);
this.mrulist = new LinkedList();
this.writerstack = new Stack();
@@ -163,6 +162,7 @@
this.heapsize = params.getParameterAsInteger("heapsize",60000000);
this.cleanupthreadinterval =
params.getParameterAsInteger("cleanupthreadinterval",10);
this.maxobjects = params.getParameterAsInteger("maxobjects",100);
+ this.cache = new HashMap((int)(this.maxobjects * 1.2));
this.priority =
params.getParameterAsInteger("threadpriority",Thread.currentThread().getPriority());
this.filesystem = params.getParameterAsBoolean("filesystem",false);
if ((this.priority < 1) || (this.priority > 10)) {
@@ -203,8 +203,8 @@
* Thread writer writes objects from the writer stack onto the filesystem.
*/
public void run() {
- while (true) {
- if(Thread.currentThread().getName().equals("checker")) {
+ if(Thread.currentThread().getName().equals("checker")) {
+ while (true) {
if (this.jvm.totalMemory() > this.heapsize) {
this.jvm.runFinalization();
this.jvm.gc();
@@ -217,13 +217,14 @@
try {
Thread.currentThread().sleep(this.cleanupthreadinterval * 1000);
} catch (InterruptedException ignore) {}
- } else if(Thread.currentThread().getName().equals("writer")) {
+ }
+ } else if(Thread.currentThread().getName().equals("writer")) {
+ while (true) {
+ getLogger().debug("Writerthread awake!");
while(!writerstack.empty()) {
try {
- getLogger().debug("Writerthread awake!");
TmpStackObject tmp = (TmpStackObject)this.writerstack.pop();
- String key = tmp.getKey().toString();
- this.fsstore.store(getFileName(key), tmp.getObject());
+ this.fsstore.store(getFileName(tmp.getKey().toString()),
tmp.getObject());
} catch(java.io.IOException e) {
getLogger().error("Error in writer thread",e);
} catch(Exception ex) {
@@ -256,34 +257,28 @@
public void hold(Object key, Object value) {
getLogger().debug("Holding object in memory. key: " + key);
getLogger().debug("Holding object in memory. value: " + value);
- boolean serialisedFlag;
/** ...first test if the max. objects in cache is reached... */
- if(this.mrulist.size() >= this.maxobjects) {
+ while (this.mrulist.size() >= this.maxobjects) {
/** ...ok, heapsize is reached, remove the last element... */
this.free();
}
/** put the object on the filesystem */
if(this.filesystem) {
- if(this.checkSeriazable(value)) {
+ if(this.checkSerializable(value)) {
getLogger().debug("Storing object on fs");
this.writerstack.push(new TmpStackObject(key,value));
getLogger().debug("Stack size=" + writerstack.size());
- serialisedFlag = true;
synchronized (this.writer) {
this.writer.notify();
}
- } else {
- serialisedFlag = false;
}
- } else {
- serialisedFlag = false;
}
/** ..put the new object in the cache, on the top of course ... */
- this.cache.put(key, new
CacheObject(value,System.currentTimeMillis(),serialisedFlag));
+ this.cache.put(key, value);
+ this.mrulist.remove(key);
this.mrulist.addFirst(key);
- getLogger().debug("Hashmap size=" + cache.size());
}
/**
@@ -297,7 +292,7 @@
/** put the accessed key on top of the linked list */
this.mrulist.remove(key);
this.mrulist.addFirst(key);
- return ((CacheObject)this.cache.get(key)).getCacheObject();
+ return this.cache.get(key);
} catch(NullPointerException e) {
getLogger().debug("Object not found in memory");
/** try to fetch from filesystem */
@@ -334,7 +329,7 @@
getLogger().debug("Removing object from store");
this.cache.remove(key);
this.mrulist.remove(key);
- this.fsstore.remove(this.cachedirstr + File.separator +
URLEncoder.encode(key.toString()));
+ this.fsstore.remove(getFileName(key.toString()));
}
/**
@@ -360,7 +355,6 @@
*/
public void free() {
try {
- getLogger().debug("Freeing store");
this.cache.remove(this.mrulist.getLast());
this.mrulist.removeLast();
} catch (Exception e) {
@@ -373,7 +367,7 @@
* FIXME: In the moment only CachedEventObject or
* CachedStreamObject are stored.
*/
- private boolean checkSeriazable(Object object) {
+ private boolean checkSerializable(Object object) {
try {
getLogger().debug("Object=" + object);
if((object.getClass().getName().equals("org.apache.cocoon.caching.CachedEventObject"))
@@ -384,7 +378,7 @@
return false;
}
} catch (Exception e) {
- getLogger().error("Error in checkSeriazable()!", e);
+ getLogger().error("Error in checkSerializable()!", e);
return false;
}
}
@@ -399,21 +393,20 @@
.append(URLEncoder.encode(key.toString()))
.toString();
}
-
+
/**
* Container object for the documents.
- */
class CacheObject {
private long time = -1;
private Object cacheObject;
private boolean serialised;
-
+
public CacheObject(Object ToCacheObject, long lTime, boolean serialised) {
this.cacheObject = ToCacheObject;
this.time = lTime;
this.serialised = serialised;
}
-
+
public Object getCacheObject() {
return this.cacheObject;
}
@@ -426,9 +419,12 @@
return this.serialised;
}
}
+ */
- /** Temporary container object for the writerstack */
- class TmpStackObject {
+ /**
+ * Temporary container object for the writerstack
+ */
+ static class TmpStackObject {
private Object object;
private Object key;
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]