Hi all,
I have a problem which classloading and ant 1.8.1, junit 4.8.2 and log4j
1.2.16 or any
third-party libraries:
<junit reloading="true">
<classpath refid="junit.classpath.ref"/>
<batchtest fork="false">
<fileset refid="${test-fileset-refid}"/>
</batchtest>
.....
</junit>
with the classpath:
<fileset dir="${modules.dir}">
<include name="**/lib*/*.jar" />
<exclude name="**/**/log4j.jar"/>
</fileset>
Following target is called:
<target name="only.junit4.example">
<antcall target="only.junit4.example1"/>
<antcall target="only.junit4.example2"/>
</target>
only.junit4.example1 and only.junit4.example2 both call the target with
junit-call above
with different filesets.
in the testclasses of both antcalls I have static variables private
static LOGGER = Logger.getLogger(... .class);
If I create a heapdump after the second target there's the following
behaviour:
1. If I remove exclude log4j from fileset, two SplitClassLoader-instance
are still available, which seem to be never gc'd
2. If I start it with the exclude-tag, but give log4j with -lib to ant,
both splitcalssloaders are gc'd correctly, but it seems there are
multiple AntClassLoader5-instance not gc'd
Problem:
Without forking every testcase (not suite) the memory-usage increases
step by step, because neither the classloaders nor any static reference
is gcd (singletons from legacycode).
After half my tests have run, I get a PermGenSpace-OOM (configured 500M
for permgenspace)
1. Is this behaviour of the classloaders a behaviour you would expect or
do we have a classloader-leak?
2. Do we have to cleanup all statics and singletons to decrease
memory-footprint or does a generic solution exist?
3. parameter -lib is only a workaround, isn't it? How should we give the
libs to ant?
4. Is it possible to use reloading="false"? I guess I didn't have any
other behaviour
Any help welcome
Thank you by now
Markus