Wow!  Fabulous.  Thanks for your hard work on this.  (and to others on
the list for ideas as well).

A couple of questions/requests:
* Is this built against the release of Velocity 1.5?
* Did you run ant test and did it pass?
* Is it easy to break the patch up into two patches, one for each
issue?  Makes it easier to track and test.  Ideally, the patch for
memory usage should be attached to JIRA issue 223 while the other
patch would be a separate issue.

If this is too difficult (e.g. the changes are integrated together)
then we can handle it as one.  But it's sometimes simpler to address
issues separately.

It surprises me we still have synchronization issues -- there were
fixes on this for 1.5.  Are you using the same template object in your
parsing or are you repeatedly retrieving it with a resource loader?

WILL

Can you please attach

On 3/30/07, Lei Gu <[EMAIL PROTECTED]> wrote:




Hi gentleman,

We are submitting fixes for issue number 223 and fixes for newly discovered
multi-thread concurrency issue in Velocity Engine.

Here is a brief summary of the problem and what we did to fix it.



Issue number 223, Velocity Engine uses excessive amount of memory when a
large number of directives and macros are used.

When a macro or directive is used, they are parsed at run time and the same
macro will be parsed every time it is invoked from another macro. This
results in an explosion of the duplicated string images. We introduce a
string image pool. Before a string image is returned from VelocityCharStream
GetImage method, we simply checks against the string image pool. If the
string image exists in the pool, we will return the image from the pool.
Otherwise we simply return the image itself. We observe a 30% memory
footprint reduction after this.



We obtained additional savings by not adding ASTComment node to the parse
tree, as well as removing unused member variables in SimpleNode. However,
these changes are not part of submitted patch.



Multi-thread concurrency issue

During our concurrency testing, we observed NullPointer exceptions being
thrown when two people hit the same page at the same time for the first
time. Upon further investigation, it turns out that we need to synchronize
the init method on ASTDirective, ASTSetDirective, and render method on
ASTSetDirective, and VelocimacroProxy.



Basically, the problem is introduced as the following; when two threads
attempts to parse and render the same template at the same time. Thread1
finishes parsing first and proceeds to the render method call, while thread
2 is still busy parsing and will overwrite the existing parse tree that is
being used by thread 1 for rendering purpose. Thus under certainly condition
a NullPointer exception will be thrown.



I have run through all existing test cases successfully and the memory
saving has been verified by YourKit profiler.

Let me know if you have any questions.

Thanks.

-- Lei
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




--
Forio Business Simulations

Will Glass-Husain
[EMAIL PROTECTED]
www.forio.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to