java - 混合 Groovy 和 Java 代码在 Jetty 上运行而不会出现 "PermGen Space"错误

标签 java maven web groovy jetty

在我正在处理的这个基于 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 Controller 中,我使用 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";
    }
}

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

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)

如果我注释掉 Controller 类中的 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";
    }
}

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

最佳答案

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

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

相关:

关于java - 混合 Groovy 和 Java 代码在 Jetty 上运行而不会出现 "PermGen Space"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19450767/

相关文章:

Java:获取变量的类

java - 带有 RDF/XML 文件的 Hadoop MapReduce

javascript - SpringBoot Angular 应用程序不提供所有 js 文件

java - 如果我使用 Eclipse,为什么还需要 Maven?

javascript - Angular JS应用程序页面刷新问题

php - MySQL - 按分组元素排序

Java自定义类

java - 要获取的 SQL,如果不存在则插入新条目

java - 从 grails BuildConfig 中排除 Maven 依赖项

asp.net - 用于 ASP.NET 网站的 Miniprofiler