Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] Java OOM - AspectJ or Java bug?

I have encountered a weird OutOfMemoryError problem.

It appears to be some kind of infinite loop in Java's class file parsing. However, it only occurs after running the AspectJ compiler over the class.

So I'm not sure who is at fault... AspectJ or Java itself?

I'm using AspectJ 1.6.10 and java 1.6.0.37:

java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)

I've created a test case available here as an ant project. It is pretty simple, triggered by this class:

public class Bug {

    @org.springframework.beans.factory.annotation.Configurable
    public static class ClassA<T extends Interface1 & Interface2> {
    }

    public static class ClassB extends ClassA<ClassB> implements Interface1, Interface2 {
    }

    public interface Interface1 {
    }

    public interface Interface2 {
    }

    public static void main(String[] args) throws Exception {
        System.out.println(ClassB.class.getGenericSuperclass());
    }
}

Compile that program, run the AspectJ compiler over it to weave the @Configurable annotation, and then run it.

I get this result after a several second pause:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:2760)
    at java.util.Arrays.copyOf(Arrays.java:2734)
    at java.util.ArrayList.ensureCapacity(ArrayList.java:167)
    at java.util.ArrayList.add(ArrayList.java:351)
    at sun.reflect.generics.parser.SignatureParser.parseFormalTypeParameters(SignatureParser.java:190)
    at sun.reflect.generics.parser.SignatureParser.parseZeroOrMoreFormalTypeParameters(SignatureParser.java:177)
    at sun.reflect.generics.parser.SignatureParser.parseClassSignature(SignatureParser.java:171)
    at sun.reflect.generics.parser.SignatureParser.parseClassSig(SignatureParser.java:126)
    at sun.reflect.generics.repository.ClassRepository.parse(ClassRepository.java:34)
    at sun.reflect.generics.repository.ClassRepository.parse(ClassRepository.java:23)
    at sun.reflect.generics.repository.AbstractRepository.<init>(AbstractRepository.java:56)
    at sun.reflect.generics.repository.GenericDeclRepository.<init>(GenericDeclRepository.java:30)
    at sun.reflect.generics.repository.ClassRepository.<init>(ClassRepository.java:30)
    at sun.reflect.generics.repository.ClassRepository.make(ClassRepository.java:47)
    at java.lang.Class.getGenericInfo(Class.java:2254)
    at java.lang.Class.getTypeParameters(Class.java:621)
    at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:39)
    at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:35)
    at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:77)
    at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:86)
    at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:122)
    at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:31)
    at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:66)
    at java.lang.Class.getGenericSuperclass(Class.java:677)
    at Bug.main(Bug.java:18)


Any ideas?

Thanks,
-Archie

--
Archie L. Cobbs


Back to the top