[ 
https://issues.apache.org/jira/browse/VELOCITY-150?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Henning Schmiedehausen closed VELOCITY-150.
-------------------------------------------


> Memory leak in resource loader
> ------------------------------
>
>                 Key: VELOCITY-150
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-150
>             Project: Velocity
>          Issue Type: Bug
>          Components: Build
>    Affects Versions: 1.3
>         Environment: Operating System: Linux
> Platform: Other
>            Reporter: Kim Madsen
>         Assigned To: Velocity-Dev List
>             Fix For: 1.5
>
>         Attachments: DataSource.patch, results.txt, results.xls, 
> VelocityMemorySimple.java
>
>
> 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 of
> heap memory. 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 4th of marts 2003, 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 
> Below follows my unit test
> ________________________________________________________________________
> 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;
>     }
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


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

Reply via email to