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]