Hi Folks,
I've completed my application and am investigating massive memory
demands (100M - 300M). The following are some of my conclusions, which
may be of use to others. I'm definitely not an expert so comments please
from those that know better. Some of the following does seems to
contradict other posting about memory configuration.
The java heap is the area of RAM reserved for use by the java virtual
machine. At any time only part of the heap will be in use. The size of
the part in use will vary over time as classes and instances are loaded
and released. If the size in use approaches the size of the heap, then
more memory will be allocated to the heap. If the amount in use falls to
a small percentage of the heap size for a relatively long period the
size of the heap will be reduced by the jvm, to free memory for the
operating system.
Xms and Xmx are set when the jvm is started. If using Tomcat-4.0.1 set
the environment parameter CATALINA_OPTS=-Xms<value> -Xmx<value> before
starting Tomcat.
Xms - sets initial java heap size
---------------------------------
With cocoon there seems to be little point setting this as start-up
times are dominated by other factors.
Xmx - sets maximum java heap size
---------------------------------
This is the maximum amount of memory available to Tomcat and Cocoon. If
there is demand for more than is available, then a
java.lang.outofmemory() exception will occur - to be avoided at all
costs!!! I've found it best to set this to a size which leaves some RAM
for the operating system. If there is virtual memory configured on the
operating system (hard disk pretending to be RAM) then set the maximum
jvm heap low enough to avoid using it.
Store Janitor
-------------
In the cocoon.xconf file there are setting for the store-janitor. The
store, I think, is a file cache run by cocoon which therefore places
demands on the jvm heap. These setting control the size of the file
cache to stop it using up all of the heap and thereby causing a
java.lang.outofmemory() error.
<store-janitor
class="org.apache.cocoon.components.store.StoreJanitorImpl"
logger="root.store">
<parameter name="freememory" value="1000000"/>
<parameter name="heapsize" value="60000000"/>
<parameter name="cleanupthreadinterval" value="10"/>
<parameter name="threadpriority" value="5"/>
</store-janitor>
parameter 'heapsize' - the size of jvm heap below which the file cache
is allowed to grow. When actual heap size (not heap in use) exceeds this
size then the store-janitor will take steps to reduce it, assuming the
amount of actual free memory is below the parameter 'freememory' limit.
Parameter 'heapsize' must be less than Xmx otherwise the store would be
allowed to fill the heap. The difference between Xmx and 'heapsize' must
be sufficient memory for cocoon during a 'cleanupthreadinterval'.
parameter 'freememory' - is the difference between heap size and heap in
use which the store-janitor must achieve (by giving up memory) if the
actual heap size has exceeded the parameter 'heapsize'. This is the
amount of free memory which must be available to cocoon during the
'cleanupthreadinterval' assuming the heapsize might no longer be able to
increase. If 'freememory' is set too large, then the store-janitor will
give up more of its cache than it needs to, or might not be able to free
sufficient by emptying the file cache.
parameter 'cleanupthreadinterval' - the period in seconds between
store-janitor's attempts to monitor memory and adjust the store. Also
triggers finalization and the garbage collector.
My suggested settings for different ram sizes in Megabytes:
(default)64 128 256 384
-- --- --- ---
Xms 0 0 0 0
Xmx 64 100 228 356
heapsize 60 80 208 236
freememory 1 20 20 20
Note:
----
The difference between Xmx and heapsize is needed to ensure sufficient
free memory for cocoon during the first cleanupthreadinterval in which
the actual heap size exceeds 'heapsize'. Similarly the parameter
'freememory' tells the store-janitor to attempt to clear sufficient
memory for the next interval. So I've suggested the difference between
Xms and heapsize be the same as the size of freememory. It might need to
be bigger on a fast machine, or the interval reduced.
Would the experts please comment on the above. Please let me know if I'm
on the right lines or if there is anything else I should know about.
Many thanks,
Pete Hargreaves.
P.S. My system is:
Gateway G6-350 (392,612 RAM), NT4.0sp6, jdk-1.3.1, tomcat-4.0.1, cocoon-2.0
Gateway G6-350 (392,612 RAM), RH Linux 7.0, jdk-1.3, tomcat-4.0.1,
cocoon-2.0
---------------------------------------------------------------------
Please check that your question has not already been answered in the
FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>
To unsubscribe, e-mail: <[EMAIL PROTECTED]>
For additional commands, e-mail: <[EMAIL PROTECTED]>