You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@velocity.apache.org by chenjian <ch...@uvic.ca> on 2004/09/09 19:20:12 UTC
out of memory error using VelocityEngine multiple instances
Hi,
I am profiling my velocity web application and it seems to me that after
velocity completes the rendering, it leaves some objects behind. When running
some complex templates with big objects, the memory goes up and never comes
down even after velocity finishes parsing.
Therefore, I did some simple test, and here is a snippet of code I used:
for (int i = 0; i < 100; i++)
{
StringWriter sw = new StringWriter();
VelocityEngine ve = new VelocityEngine();
ve.setProperty(FILE_RESOURCE_LOADER_PATH, ".");
ve.init();
ve.evaluate(ctx, sw, "vlog", str);
System.out.println(sw.toString());
}
I passed in the template as a java String and used the evaluate method.
I got java.lang.OutOfMemoryError when profiling using JDK's hprof.
The hprof file snippet is as follows:
SITES BEGIN (ordered by live bytes) Thu Sep 09 10:07:01 2004
percent live alloc'ed stack class
rank self accum bytes objs bytes objs trace name
1 19.93% 19.93% 9397200 573 9397200 573 300143 int[]
2 19.90% 39.83% 9380800 572 9380800 572 300144 int[]
3 18.96% 58.79% 8938000 545 9397200 573 300123 int[]
4 18.96% 77.75% 8938000 545 9397200 573 300124 int[]
5 9.98% 87.73% 4703184 573 4703184 573 300142 char[]
6 9.49% 97.22% 4473360 545 4703184 573 300122 char[]
7 0.51% 97.72% 238368 573 238368 573 300129 int[]
8 0.43% 98.15% 201696 573 201696 573 300141 int[]
9 0.28% 98.43% 132936 573 132936 573 300127 int[]
10 0.28% 98.71% 132936 573 132936 573 300126 int[]
11 0.28% 99.00% 132936 573 132936 573 300125 int[]
12 0.23% 99.23% 109984 4676 109984 4676 300167
org.apache.velocity.runtime.parser.node.Node[]
13 0.22% 99.45% 105432 573 105432 573 300140 int[]
14 0.15% 99.60% 68992 4312 68992 4312 300172
org.apache.velocity.runtime.parser.node.Node[]
15 0.08% 99.68% 40016 1 40016 1 300077 java.lang.String[]
16 0.08% 99.77% 40016 1 40016 1 300076 java.lang.String[]
17 0.08% 99.85% 37856 28 38752 56 300158
org.apache.velocity.runtime.parser.node.Node[]
18 0.07% 99.92% 32088 573 32088 573 300128
org.apache.velocity.runtime.parser.Parser$JJCalls[]
19 0.01% 99.93% 5376 224 5376 224 300188
org.apache.velocity.runtime.parser.node.Node[]
SITES END
So, it seems that looping through multiple velocity engine instances leaves
some velocity objects in the heap and not garbage collected. For example,
org.apache.velocity.runtime.parser.node.Node[].
Could anyone help me to look into this? How can I make velocity engine run and
go away cleanly without leaving any un-collected objects behind?
Thanks a lot,
Jian
---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-user-help@jakarta.apache.org