[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[aspectj-users] LTW (load time weaving) with Aj throws OutOfMemoryError
|
Hi,
I'm developing an Ant task which will use LTW to enhance the classes
specified in <classpath> nested element of my Ant task.
Basically, I create a subclass of AntClassLoader, the classloader is at the bottom of classloader tree. and use
org.aspectj.weaver.loadtime.Aj to perform LTW,
here's my ClassLoader code snippet,
class WeaveClassLoader extends AntClassLoader {
// aspectj byte-code transformer
protected Aj transformer = null;
// whether need byte-code transformer.
protected boolean isAjOn = false;
@Override
protected final Class defineClassFromData(File container, byte[] classData,
String classname) throws IOException {
byte[] classBytes = transform(classname, classData, this);
return super.defineClassFromData(container, classBytes, classname);
}
protected byte[] transform(String classname, byte[] byteCode,
ClassLoader classloader) {
if (isTransformerTurnOn() && isWeavedClass(classname))
return transformer.preProcess(classname, byteCode, this);
return byteCode;
}
@Override
protected synchronized Class loadClass(String classname, boolean resolve)
throws ClassNotFoundException {
Class theClass = findLoadedClass(classname);
if (theClass != null) {
return theClass;
}
if (isSplit(classname) || isAspect(classname)) {
theClass = findClass(classname);
if (resolve) {
resolveClass(theClass);
}
} else {
theClass = super.loadClass(classname, resolve);
}
return theClass;
}
The function run pretty well, but over time, it consumed more memory and eventually threw OutOfMemory and aborted.
The stacktrace is as follows,
testErrorHandling_exceptiontype:
Jul 20, 2008 2:36:10 PM org.aspectj.weaver.tools.Jdk14Trace error
SEVERE: junit.framework.Test
java.lang.OutOfMemoryError: CG(q0)
[org/aspectj/apache/bcel/Constants.<clinit>()V] JVM@cgFail
(src/jvm/code/codemanager.c:693). Java heapsize=604577792, pa
at org.aspectj.apache.bcel.classfile.Attribute.readAttribute(Attribute.java:177)
at org.aspectj.apache.bcel.classfile.FieldOrMethod.<init>(FieldOrMethod.java:111)
at org.aspectj.apache.bcel.classfile.Field.<init>(Field.java:83)
at org.aspectj.apache.bcel.classfile.ClassParser.readFields(ClassParser.java:280)
at org.aspectj.apache.bcel.classfile.ClassParser.parse(ClassParser.java:172)
at org.aspectj.apache.bcel.util.ClassLoaderRepository.loadClass(ClassLoaderRepository.java:288)
at org.aspectj.weaver.bcel.BcelWorld.lookupJavaClass(BcelWorld.java:369)
at org.aspectj.weaver.bcel.BcelWorld.resolveDelegate(BcelWorld.java:338)
at org.aspectj.weaver.ltw.LTWWorld.resolveDelegate(LTWWorld.java:97)
at org.aspectj.weaver.World.resolveToReferenceType(World.java:378)
at org.aspectj.weaver.World.resolve(World.java:271)
at org.aspectj.weaver.bcel.BcelWeaver.addLibraryAspect(BcelWeaver.java:165)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.registerAspects(ClassLoaderWeavingAdaptor.java:399)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.registerDefinitions(ClassLoaderWeavingAdaptor.java:240)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.initialize(ClassLoaderWeavingAdaptor.java:152)
at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.initialize(Aj.java:151)
at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.getWeavingAdaptor(Aj.java:156)
at org.aspectj.weaver.loadtime.Aj$WeaverContainer.getWeaver(Aj.java:122)
at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:73)
.....
Jul 20, 2008 2:36:10 PM org.aspectj.weaver.tools.Jdk14Trace info
INFO: Dumping to .\ajcore.20080720.143610.453.txt
302 tests.functional.webapp.servlet25.clarifications.client.TestClarifications.testClarifications (junit)
testErrorHandling_errorcode:
Jul 20, 2008 2:36:12 PM org.aspectj.weaver.tools.Jdk14Trace error
SEVERE: junit.framework.Test
java.lang.OutOfMemoryError: class allocation, 967086156 loaded,
893648896 footprint JVM@check_alloc
(src/jvm/model/classload/classalloc.c:118). 5841 bytes
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at org.apache.tools.ant.loader.AntClassLoader2.defineClassFromData(AntClassLoader2.java:78)
at org.apache.tools.ant.AntClassLoader.getClassFromStream(AntClassLoader.java:1090)
at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1154)
at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:984)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.initialize(ClassLoaderWeavingAdaptor.java:140)
at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.initialize(Aj.java:151)
at org.aspectj.weaver.loadtime.Aj$ExplicitlyInitializedClassLoaderWeavingAdaptor.getWeavingAdaptor(Aj.java:157)
at org.aspectj.weaver.loadtime.Aj$WeaverContainer.getWeaver(Aj.java:122)
at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:73)
My Ant task will destroy the classloader which creates Aj after each
processing. It looks to me the loaded/transformed classes is not clean
up when the classloader is destroyed.
I used the latest AspectJ relase, 1.6.1
Any help is appreciated.
Anfernee