Hi,
>From: Peter Hargreaves [mailto:[EMAIL PROTECTED]]
>
>Hi Gerhard and Team,
>
>I'm posting in this group now I think I found a design problem with
>store-janitor.
Slowly but constant this Store issues are a PITA for me :-/. I don't know
why this is in Java that difficult to control a little bit memory.
That's the price for automatic Memory Management!
(Nothing against you Peter!)
>I think store-janitor works fine when it can free sufficient memory by
>calling the finalize and garbage collection. But if it needs to free the
>store it locks up!
>
>The reason it appears to lock up (I think), is because it calls the
>garbage collector too often - i.e. every time it frees an item from a
>store. Once called the store-janitor will free an item and call the
>garbage collector, repeating both until it has freed sufficient memory.
>If one item frees 4.44k and the garbage collector takes 2844ms then the
>time taken to free 20m will be 3.5 hours - during which time the system
>appears to be locked!
>
>The following is a brief summary of my analysis:
>
>With the following settings:
>Xms=0m
>Xmx=140m
>heapsize =100000000
>freememory=20000000
>
>Using Optimizeit I watched my java heap 'total' and 'in-use' growing.
>When total heapsize gets to 100m the store-janitor kicks in and frees a
>chunk of memory. This repeats every ten seconds but each time it frees
>less memory until it is no longer able to free memory and locks up. When
>locked up the garbage collector is running about 99% of the time.
>
>Looking at the store-janitor code and my debug log I can see exactly
>what happens when it locks.
>
>I notice, examining Store-janitorImpl.run() that, if the garbage
>collector alone manages to clear sufficient memory, no store items are
>cleared (as expected). This is possibly all that is happening when
>store-janitor appears to work! However if that is not sufficient the
>following loop is started.
>
> synchronized (this) {
> while (this.memoryLow() &&
>this.getStoreList().size() > 0) {
> this.freeMemory();
> }
> this.resetIndex();
> }
>
>this.memoryLow() tests to see if sufficient is free and prints Debug info.
>this.freeMemory() removes an item, runs garbage collection, and prints
>Debug info.
>
> From my log files I can see this loop being executed. Each time round
>the loop I can see how much memory is freed and how long it takes.
>Typically it can take seconds to free one item which can be only a few
>kb. So, in my case with 'freememory' set to 20m, it is likely to take a
>few hours to free sufficient memory!!
>
>I've noticed when running Optimizeit that although garbage collection
>can be quick, it sometimes takes a few seconds. If it has just been run,
>and you force it to run again, then it seems to take longer. If it can't
>find much to freeup, it seems to do a more time consuming search for
>garbage.
This all makes sense too me.
Then we need a limit how often the GC can be called. Maybe 100 loops
should be enough. After that it waits as configured (threadinterval)
before the next execution.
Maybe there is a more elegent solution.
I actually develop in jakarta-commons a store (again) with Weak References.
This is a much better solution. No Threads, no GC calls. When it is ready
to introduce I'll explain you!
Sorry for all that crap with Store and everything.
Gerhard
--------------------------
Hey! It compiles! Ship it!
--------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]