1

私が取り組んでいるこの Web ベースの Maven プロジェクトでは、既存の Java コードの上に Groovy コードを使用しようとしています。これまでのところ、Groovy で作成されたオブジェクトを Java から呼び出そうとすると、「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";
    }
}

Web からコントローラーを押すと、次のようになります。

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たくさんあります。これは、クラスローダのどこかでメモリ リークが発生しているようです。プロファイラーを起動して、アクティブなクラスローダーを分析することをお勧めします。そのうちの 1 つには、多数のクラスがロードされている必要があります。

まだ Java 5 を使用している場合は、Java 7 を試してください。本当に 5 を使い続けたい場合は-XX:+CMSPermGenSweepingEnabled、Java の起動オプションに必ず追加してください。

関連している:

于 2013-10-18T13:37:28.547 に答える