Skip to main content

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

Replying to my own post...

I just tried this on a Java 1.7 machine and instead of OutOfMemoryError, I get this:

Exception in thread "main" java.lang.reflect.GenericSignatureFormatError
    at sun.reflect.generics.parser.SignatureParser.error(SignatureParser.java:126)
    at sun.reflect.generics.parser.SignatureParser.progress(SignatureParser.java:135)
    at sun.reflect.generics.parser.SignatureParser.parseFormalTypeParameters(SignatureParser.java:240)
    at sun.reflect.generics.parser.SignatureParser.parseZeroOrMoreFormalTypeParameters(SignatureParser.java:221)
    at sun.reflect.generics.parser.SignatureParser.parseClassSignature(SignatureParser.java:214)
    at sun.reflect.generics.parser.SignatureParser.parseClassSig(SignatureParser.java:158)
    at sun.reflect.generics.repository.ClassRepository.parse(ClassRepository.java:52)
    at sun.reflect.generics.repository.ClassRepository.parse(ClassRepository.java:41)
    at sun.reflect.generics.repository.AbstractRepository.<init>(AbstractRepository.java:74)
    at sun.reflect.generics.repository.GenericDeclRepository.<init>(GenericDeclRepository.java:48)
    at sun.reflect.generics.repository.ClassRepository.<init>(ClassRepository.java:48)
    at sun.reflect.generics.repository.ClassRepository.make(ClassRepository.java:65)
    at java.lang.Class.getGenericInfo(Class.java:2271)
    at java.lang.Class.getTypeParameters(Class.java:640)
    at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.validateConstructorArguments(ParameterizedTypeImpl.java:57)
    at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.<init>(ParameterizedTypeImpl.java:53)
    at sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl.make(ParameterizedTypeImpl.java:95)
    at sun.reflect.generics.factory.CoreReflectionFactory.makeParameterizedType(CoreReflectionFactory.java:105)
    at sun.reflect.generics.visitor.Reifier.visitClassTypeSignature(Reifier.java:140)
    at sun.reflect.generics.tree.ClassTypeSignature.accept(ClassTypeSignature.java:49)
    at sun.reflect.generics.repository.ClassRepository.getSuperclass(ClassRepository.java:84)
    at java.lang.Class.getGenericSuperclass(Class.java:696)
    at Bug.main(Bug.java:18)

This is using:

java version "1.7.0_09"
OpenJDK Runtime Environment (IcedTea7 2.3.3) (suse-3.16.1-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

So it appears that Java seems to think this is an AspectJ bug.

Thanks,
-Archie

On Sat, Nov 17, 2012 at 11:13 PM, Archie Cobbs <archie@xxxxxxxxxxxx> wrote:
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




--
Archie L. Cobbs


Back to the top