1

在我正在处理的这个基于 Web 的 Maven 项目中,我试图在我现有的 Java 代码之上使用一些 Groovy 代码。到目前为止,每当我尝试从 Java 调用一些 Groovy 创建的对象时,我都会得到史诗般的“java.lang.OutOfMemoryError: PermGen space”。Web 项目使用 Jetty Maven 插件在 Jetty 上运行。

我已将烫发尺寸增加到以下:-

export MAVEN_OPTS="-Xms2048m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=1024m"

在使用 GMaven 1.5 或 Groovy-eclipse-compiler 2.8.0-01 时,我看到了同样的问题。

例如,在这个 Spring MVC 控制器中,我使用Stuff的是一个简单的 POGO 对象。顺便说一句,这是我整个 Java EE 项目中使用的唯一 Groovy 代码。

@Controller
@RequestMapping(value = "/")
public class HomeController {

    @RequestMapping(method = RequestMethod.GET)
    public String main() {
        Stuff stuff = new Stuff();
        stuff.setName("Bla");
        System.out.println(stuff.getName());
        return "home";
    }
}

当我从网络上点击控制器时,我得到了这个:-

java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.findBootstrapClass(Native Method)
    at java.lang.ClassLoader.findBootstrapClassOrNull(ClassLoader.java:926)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:297)
    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:239)
    at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230)
    at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:407)
    at org.eclipse.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:383)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2475)
    at java.lang.Class.getDeclaredMethods(Class.java:1818)
    at org.codehaus.groovy.reflection.CachedClass$3$1.run(CachedClass.java:84)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:81)
    at org.codehaus.groovy.reflection.CachedClass$3.initValue(CachedClass.java:79)
    at org.codehaus.groovy.util.LazyReference.getLocked(LazyReference.java:46)
    at org.codehaus.groovy.util.LazyReference.get(LazyReference.java:33)
    at org.codehaus.groovy.reflection.CachedClass.getMethods(CachedClass.java:250)
    at org.codehaus.groovy.runtime.m12n.SimpleExtensionModule.createMetaMethods(SimpleExtensionModule.java:111)
    at org.codehaus.groovy.runtime.m12n.SimpleExtensionModule.getMetaMethods(SimpleExtensionModule.java:93)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerExtensionModuleFromProperties(MetaClassRegistryImpl.java:192)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerExtensionModuleFromMetaInf(MetaClassRegistryImpl.java:174)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerClasspathModules(MetaClassRegistryImpl.java:156)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:111)
    at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:73)
    at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:33)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClassUnderLock(ClassInfo.java:162)
    at org.codehaus.groovy.reflection.ClassInfo.getMetaClass(ClassInfo.java:192)
    at myproject.bean.Stuff.$getStaticMetaClass(Stuff.groovy)
    at myproject.bean.Stuff.<init>(Stuff.groovy)
    at myproject.controller.HomeController.main(HomeController.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

如果我从控制器类中注释掉 3 行 Groovy 代码,则一切正常,没有错误:-

@Controller
@RequestMapping(value = "/")
public class HomeController {

    @RequestMapping(method = RequestMethod.GET)
    public String main() {
        //Stuff stuff = new Stuff();
        //stuff.setName("Bla");
        //System.out.println(stuff.getName());
        return "home";
    }
}

我该如何解决这个问题?谢谢。

4

1 回答 1

0

-XX:MaxPermSize=1024m很多。这听起来像是类加载器中某处的内存泄漏。我建议启动您的分析器并分析活动的类加载器。其中之一应该加载了很多类。

如果您仍然使用 Java 5,请尝试 Java 7。如果您真的想继续使用 Java 5,请确保添加-XX:+CMSPermGenSweepingEnabled到 Java 启动选项。

有关的:

于 2013-10-18T13:37:28.547 回答