Hello,

I am not sure if everybody is familiar with the 
CocoonStoreJanitor/StoreJanitorImpl, but in short it tries to free memory from 
cocoon's different caches, and does this according some configuration. For 
example, 

<store-janitor logger="core.store.janitor">
    <!-- How much free memory shall be available in the jvm -->
    <parameter name="freememory" value="2048000"/>
    <!-- Indicates the limit of the jvm memory consumption. The default max
         heapsize for Sun's JVM is (almost) 64Mb -->
    <parameter name="heapsize" value="30000000"/>
    <!-- How often shall the cleanup thread check memory -->
    <parameter name="cleanupthreadinterval" value="10"/>
    <!-- Experimental adaptive algorithm for cleanup interval
    <parameter name="adaptivethreadinterval" value="true"/>
    --> 
    <!-- Indicates the thread priority of the cleanup thread -->
    <parameter name="threadpriority" value="5"/>
    <!-- How much percent of the elements of each registered Store
         shall be removed when low on memory. Default 10% -->
    <parameter name="percent_to_free" value="10"/>
    <!-- Invoke the garbage collector when low memory is reached -->
    <parameter name="invokegc" value="false"/>
</store-janitor>

Now, suppose, the JVM is low on memory. Now, I am used to have 3 stores in my 
apps, namely defaultTransientStore, eventAwareTransientStore and the 
EHDefaultStore. I am not sure how about projects of other people/companies, but 
I know I can only get some memory free from the EHDefaultStore. The other 
stores either store very small responses, or, like the defaultTransientStore, 
it only caches a couple of xslt's, which are needed for so many pages, that 
removing them makes no sense. The StoreJanitorImpl just removes keys+responses 
from one single cache at a time, and moves to the next cache the next time. 

In my opinion, the StoreJanitorImpl makes my cocoon app even worse than before 
freeing the cache memory is the following:
1) It removes from caches I think no gain is in
2) It removes cachekeys from the EHDefaultStore in the worst possible way: 
because the eviction policy from ehcache is not available from within the 
EHDefaultStore, cachekeys + reponses are just removed by starting with index 0. 
These are frequently the more important keys, which are regenerated on the next 
request (so this request is uncached, making it even harder for the JVM to stay 
away from OOM).

I have had an email conversation with Greg Luck about this, the main developer 
from ehcache. Since you cannot remove cachekeys + responses according the 
eviction policy defined in the ehcache, he came up with the idea to add keys 
with empty responses. 

So, in the StoreJanitor, I check now wether the store is instanceof 
EHDefaultStore, and if so, and if the number of keys in memoryStore is larger 
then the (maxobjects - limit) (limit is computed in calcToFree(store) as the 
number of keys to be removed), I add #limit number of keys with response "". 
This means, that when maxobjects is reached, you can have 2 cases:

1) overflowToDisk=true: the reponse is serialized to diskStore, and the 
cachekey is moved to diskStore cachekey array (by the way still in memory, but 
the response not anymore )
2) overflowToDisk=false: the cachekey + response is removed entirely

Now, at the end the added "dummy keys" are removed.

So, 

WDYT about this new way to free memory from the store. And WDYT about only 
trying to free memory from the EHDefaultStore?

Regards Ard

-- 

Hippo
Oosteinde 11
1017WT Amsterdam
The Netherlands
Tel  +31 (0)20 5224466
-------------------------------------------------------------
[EMAIL PROTECTED] / http://www.hippo.nl
-------------------------------------------------------------- 

Reply via email to