Kim, if you've verified this as a problem, would you please file it in our issue tracking system <http://issues.apache.org/bugzilla/>? Thanks.
- Dan Kim Madsen <[EMAIL PROTECTED]> writes: > I am using Velocity in a J2EE application. I had problems with my > application leaking memory. I have traced this back to Velocity. I > have made a little simple JUnit test, which demonstrates this memory > leak. It seems that every time you instantiate a Velocity Engine with > a resource loader it leaks about 1.5 Kb. If I do not include the setup > of the resource loader from properties, there is no leak. > > I found this in Velocity 1.3, but I have tried the same test with a > cvs checkout of Velocity from today, and it showed the same > problem. If I let the test run with a max heap size of 64Mb, it will > fail with OutOfMemoryError exception after about 34.000 iterations. > > I have attached the JUnit. > > Cheers, Kim Madsen > > /* Copyright (C) 1998-2002, Inceptor, Inc. All rights reserved worldwide. */ > package com.inceptor.rt; > > import com.inceptor.base.ExceptionBase; > import com.inceptor.service.DiagnosticsFact; > import com.inceptor.service.DiagnosticsIf; > import com.inceptor.util.Test; > import com.inceptor.util.TestSuite; > import com.inceptor.util.TestCaseJUnit; > import com.inceptor.util.Various; > > import java.io.StringWriter; > import java.util.Properties; > > import org.apache.velocity.VelocityContext; > import org.apache.velocity.Template; > import org.apache.velocity.app.VelocityEngine; > > /** Servlet used to test <code>rt/Servlet</code> functionality. > * > * > * @version $Id: VelocityMemorySimple.java,v 1.3 2003/02/28 17:28:52 kim Exp $ > */ > public class VelocityMemorySimple > extends TestCaseJUnit { > > private static final DiagnosticsIf diag = > DiagnosticsFact.instance(VelocityMemorySimple.class); > > private static final int ROWS_BETWEEN_DISPLAY = 1000; > private static final int ROWS_TO_ITERATE = 50000 * ROWS_BETWEEN_DISPLAY; > > private static long lastTime = -1; > > public VelocityMemorySimple(String name) throws ExceptionBase { > super(name); > } > > /////////////////////////////////////////////////////////////////// > > private void showInfo(long rowsInserted) > throws Exception { > > if (rowsInserted==0) { > System.gc(); > lastTime = System.currentTimeMillis(); > } > > if (rowsInserted%ROWS_BETWEEN_DISPLAY == 0) { > long nowTime = System.currentTimeMillis(); > System.gc(); > diag.info("Ite=" + rowsInserted > + " Mem free =" > + java.lang.Runtime.getRuntime().freeMemory() > + " Mem total=" > + java.lang.Runtime.getRuntime().totalMemory() > + " Ite/sec.=" > + ((double) 1000*ROWS_BETWEEN_DISPLAY)/(nowTime-lastTime) > ); > lastTime = nowTime; > } > } > > public void testMemory() > throws Exception { > > try { > Properties p = new Properties(); > > p.setProperty("runtime.log.logsystem.class", > "org.apache.velocity.runtime.log.SimpleLog4JLogSystem"); > p.setProperty("runtime.log.logsystem.log4j.category", "VELOCITY"); > > p.setProperty("resource.manager.logwhenfound", "true"); > > p.setProperty("velocimacro.library", ""); > > p.setProperty("resource.loader", > "datasourceglobal, datasourcecustom"); > > p.setProperty("datasourceglobal.resource.description", > "Load Templates From java:ExcediaDB Global Resources"); > p.setProperty("datasourceglobal.resource.loader.class", > > "org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader"); > p.setProperty("datasourceglobal.resource.loader.resource.datasource", > "java:ExcediaDB"); > p.setProperty("datasourceglobal.resource.loader.resource.table", > "RESOURCEGLOBALS"); > p.setProperty("datasourceglobal.resource.loader.resource.keycolumn", > "NAMESTR"); > p.setProperty("datasourceglobal.resource.loader.resource.templatecolumn", > "CONTENTCHARACTER"); > p.setProperty("datasourceglobal.resource.loader.resource.timestampcolumn", > "MODIFICATIONTIME"); > p.setProperty("datasourceglobal.resource.loader.resource.cache", > "true"); > p.setProperty("datasourceglobal.resource.loader.resource", > "6"); > > p.setProperty("datasourcecustom.resource.description", > "Load Templates From java:ExcediaDB Custom Resources"); > p.setProperty("datasourcecustom.resource.loader.class", > > "org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader"); > p.setProperty("datasourcecustom.resource.loader.resource.datasource", > "java:ExcediaDB"); > p.setProperty("datasourcecustom.resource.loader.resource.table", > "RESOURCECUSTOMS"); > p.setProperty("datasourcecustom.resource.loader.resource.keycolumn", > "NAMESTR"); > p.setProperty("datasourcecustom.resource.loader.resource.templatecolumn", > "CONTENTCHARACTER"); > p.setProperty("datasourcecustom.resource.loader.resource.timestampcolumn", > "MODIFICATIONTIME"); > p.setProperty("datasourcecustom.resource.loader.resource.cache", > "true"); > p.setProperty("datasourcecustom.resource.loader.resource", > "6"); > VelocityContext context = null; > StringWriter sw = null; > VelocityEngine ve = null; > > > for (int i=0; i<=ROWS_TO_ITERATE; i++) { > showInfo(i); > > ve = new VelocityEngine(); > ve.init(p); > } > } catch (OutOfMemoryError e) { > diag.error(e); > throw e; > } > } > > public static Test suite() throws Exception { > > diag.debug("Setup test suite"); > TestSuite suite = new TestSuite(); > > suite.addTest(new VelocityMemorySimple("testMemory")); > > return suite; > } > } > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] -- Daniel Rall <[EMAIL PROTECTED]> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]