Did "ant test" pass?
It'd be interesting to see an example high-memory use case and get a
feel for what percentage this lowers the memory use.
WILL
On 3/13/07, Sylwester Lachiewicz <[EMAIL PROTECTED]> wrote:
Will,
i try to test more JavaCC compiler and do some optimalizations with
code generation.
In Parser.jjt we can remove USER_CHAR_STREAM=true becouse auto
generated SimpleCharStream is almost identical to our
VelocityCharStream. If we decide to do this it's possible in Parser
class to:
- remove VelocityCharStream velcharstream variable - this will reduce
memory use, every VCS has 24kb arrays in memory
- change Parser CTR to simple
public Parser( RuntimeServices rs)
{
/*
* need to call the CTOR first thing.
*/
this( new ByteArrayInputStream("\n".getBytes()));
/*
* and save the RuntimeServices
*/
rsvc = rs;
}
-- and parse method to simple one:
public SimpleNode parse( Reader reader, String templateName )
throws ParseException
{
SimpleNode sn = null;
currentTemplateName = templateName;
try
{
token_source.clearStateVars();
/*
* now reinit the Parser with this CharStream
*/
ReInit(reader);
[..]
catch (Exception e)
{
rsvc.getLog().error("Parser Error: " + templateName, e);
}
currentTemplateName = "";
// finish with input strem
token_source.clearStateVars();
jj_input_stream.inputStream = null; // gc - to unrefernce
passed Reader from Parser class
return sn;
}
- (optional) TokenMgrError can be regenerated to fix some typos in comment
- regenerate javacc code and recompile.
I run test with latest Jira (3.7.4-#189 Standalone/Java6) Velocity
1.6-dev and JavaCC 4.0 and this still works ;) Of course, this need
more test - someone can test this with larger app with more templates?
Sylwester
2007/3/13, Will Glass-Husain <[EMAIL PROTECTED]>:
> Sylvester,
>
> Perhaps RuntimeInstance.parser could call a cleanup method? You can
> insert new methods into Parser.java by putting them in Parser.jjt.
>
> Re: VelocityCharStream. I'm a little leery of lazy inits unless they
> demonstrate significant performance improvements. I've found them to
> be an easy way to convolute the code without always providing
> performance benefits.
>
> WILL
>
> On 3/12/07, Will Glass-Husain <[EMAIL PROTECTED]> wrote:
> > We need to figure out a way to put this in Parser.jj. Parser.java is
> > automatically generated-- it's too complex to generate Parser.java and
> > then modify it.
> >
> > WILL
> >
> > On 3/12/07, Sylwester Lachiewicz <[EMAIL PROTECTED]> wrote:
> > > I do something like this. This works for me, but need some more tests.
> > > Also in method parse() - resource cleanup should be in finally block
> > > (currentTemplateName, token_source, velcharstream).
> > >
> > > In VelocityCharStream class we can also do some rework to lazy init
int,char
> > > buffers
> > >
> > > I'll try to contact JavaCC developers to find where Done() method should
be
> > > called during parsing.
> > >
> > > Sylwester
> > >
> > > Index: Parser.java
> > > ===================================================================
> > > --- Parser.java (revision 517275)
> > > +++ Parser.java (working copy)
> > > @@ -53,8 +53,7 @@
> > > * need to call the CTOR first thing.
> > > */
> > >
> > > - this( new VelocityCharStream(
> > > - new ByteArrayInputStream("\n".getBytes()), 1, 1 ));
> > > + this( (CharStream)null );
> > >
> > > /*
> > > * now setup a VCS for later use
> > > @@ -129,7 +128,8 @@
> > > }
> > >
> > > currentTemplateName = "";
> > > -
> > > + token_source.clearStateVars();
> > > + if (velcharstream!=null) velcharstream.Done();
> > > return sn;
> > > }
> > >
> > >
> > >
> > > 2007/3/12, Ryan Smith <[EMAIL PROTECTED]>:
> > > >
> > > >
> > > > Will,
> > > >
> > > > Where would you put the code to call the Done() method and free up the
> > > > memory?
> > > >
> > > > We currently doing profiling of Velocity as well and are trying to find
> > > > places exactly like this.
> > > >
> > > > Ryan
> > > >
> > > > -----Original Message-----
> > > > From: Will Glass-Husain [mailto:[EMAIL PROTECTED]
> > > > Sent: Monday, March 12, 2007 2:47 PM
> > > > To: Velocity Developers List
> > > > Subject: Re: JavaCC memory problems [was: Re: Problems with build
> > > > Velocity]
> > > >
> > > > Thanks for the tips! Definitely something to investigate.
> > > >
> > > > WILL
> > > >
> > > > On 3/12/07, Sylwester Lachiewicz <[EMAIL PROTECTED]> wrote:
> > > > > Hi,
> > > > >
> > > > > today JavaCC works fine - maybe there was bad day ;)
> > > > >
> > > > > I run profiler with simple velocity app (2 .vm file, simple merge) and
> > > > found
> > > > > that internal by design CharStream has method :
> > > > > ---
> > > > > /**
> > > > > * The lexer calls this function to indicate that it is done with
> > > > the
> > > > > stream
> > > > > * and hence implementations can free any resources held by this
> > > > class.
> > > > > * Again, the body of this function can be just empty and it will
> > > > not
> > > > > * affect the lexer's operation.
> > > > > */
> > > > > void Done();
> > > > > --
> > > > > but this method is never called by any JavaCC code (lexer/parser).
> > > > > In class VelocityCharStream.Done() implementation buffers are
> > > > cleaned.
> > > > >
> > > > > More, in VelocityCharStream constructor we have 3 times allocation of
> > > > 4kb
> > > > > buffer
> > > > > buffer = new char[buffersize];
> > > > > bufline = new int[buffersize];
> > > > > bufcolumn = new int[buffersize];
> > > > >
> > > > > And in class Parser constructor we create 2 times VelocityCharStream.
> > > > > So every Parser allocates about 24kb memory, even when is not needed.
> > > > >
> > > > > When I run trace I can find that memory is deallocated from old
> > > > tempate only
> > > > > on new parse request, but only to this 24kb.
> > > > > In Done method we can also null readerStreem.
> > > > >
> > > > > Mayby this will help improve memory management.
> > > > >
> > > > > Sylwester
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > 2007/3/12, Will Glass-Husain <[EMAIL PROTECTED]>:
> > > > > >
> > > > > > Hi Sylvester,
> > > > > >
> > > > > > Thanks for the note on the build script. It really needs to check
> > > > for
> > > > > > a min of 1.6.
> > > > > >
> > > > > > I'm not sure why you have problems compiling. I use javacc 3.2 as
> > > > > > well. Did you type "ant clean" first?
> > > > > >
> > > > > > JavaCC generates node files and Parser.java. The node files are not
> > > > > > needed and can be deleted. (I think this happens in the build
> > > > > > script). If you are just changing existing syntax, no manual
> > > > copying
> > > > > > of files is required. If you are adding a new Node you'll have to
> > > > > > move that into the Node directory.
> > > > > >
> > > > > > WILL
---------------------------------------------------------------------
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]