Grails PermGem错误

时间:2011-06-20 13:43:54

标签: grails permgen

我需要帮助解决这个问题。我需要有人向我解释为什么会发生这种情况以及如何防止或避免它。

Exception in thread "Thread-747" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-748" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-759" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-760" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-764" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-765" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-766" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-767" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-773" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-774" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-780" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-781" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-788" java.lang.OutOfMemoryError: PermGen space
Exception in thread "Thread-789" java.lang.OutOfMemoryError: PermGen space
2011-06-20 14:42:10,668 [http-8080-6] ERROR [/CM].[grails]  - Servlet.service() for servlet grails threw exception
java.lang.OutOfMemoryError: PermGen space
2011-06-20 14:42:10,668 [http-8080-6] ERROR [/CM].[default]  - Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: PermGen space
: java.lang.OutOfMemoryError: PermGen space
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:116)
        at _GrailsPackage_groovy$_run_closure8.doCall(_GrailsPackage_groovy:275)
        at _GrailsPackage_groovy$_run_closure8.call(_GrailsPackage_groovy)
        at _GrailsRun_groovy$_run_closure8.doCall(_GrailsRun_groovy:245)
        at RunApp$_run_closure1.doCall(RunApp.groovy:35)
        at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381)
        at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415)
        at gant.Gant$_dispatch_closure7.doCall(Gant.groovy)
        at gant.Gant.withBuildListeners(Gant.groovy:427)
        at gant.Gant.this$2$withBuildListeners(Gant.groovy)
        at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
        at gant.Gant.dispatch(Gant.groovy:415)
        at gant.Gant.this$2$dispatch(Gant.groovy)
        at gant.Gant.invokeMethod(Gant.groovy)
        at gant.Gant.executeTargets(Gant.groovy:590)
        at gant.Gant.executeTargets(Gant.groovy:589)
Caused by: java.lang.OutOfMemoryError: PermGen space
--- Nested Exception ---
java.lang.OutOfMemoryError: PermGen space
Error automatically restarting container: java.lang.OutOfMemoryError: PermGen space
Error executing script RunApp: PermGen space
java.lang.OutOfMemoryError: PermGen space
Error executing script RunApp: PermGen space
Application context shutting down...
Application context shutdown.

4 个答案:

答案 0 :(得分:20)

PermGen是JVM内存的一个区域,用于加载类。

当应用程序执行时,它会使用越来越多的内存,特别是如果你在调试环境中,如果你大量使用闭包。

解决此问题的方法是添加更多内容!

这是通过在启动应用程序时将一个或两个参数传递给JVM来完成的。

参数是:

-XX:MaxPermSize=256m
-XX:PermSize=128m

(根据您的具体需求调整值)

PermSize将是PermGen的初始大小,而MaxPermSize将是在你向帖子抛出异常之前它将增加的最大大小。

默认情况下,它设置为64M,如果你有一个“真正的”应用程序,那就不多了。

请注意:您的total memory usage将是:Heap size + Perm Size

答案 1 :(得分:1)

如果您使用的是Servlet 3.0版,那么即使增加内存也没有任何帮助,因为它是groovy编译器的问题。即将发布的新版本1.8.2 / 1.9(?)将解决此问题。在此期间,您可以将servlet版本更改回“2.5”(在BuildConfig.groovy中),这将解决此问题。

将servlet版本更改为2.5的缺点是它无法部署到Glassfish应用程序服务器,因此丑陋的变通方法更改为2.5并使用“run-app”。当你想部署到glassfish时,在BuildConfig.groovy中将servlet版本更改为“3.0”,运行“war”,然后将战争部署到Glassfish。 将其更改回“2.5”以再次在本地开发机器上运行。

答案 2 :(得分:0)

查看常见问题解答

Q: OMG I get OutOfMemoryErrors or PermGen Space errors when running Grails in development mode. What do I do?

  

自Grails 0.6以来,Grails自动重新编译Java源代码   使用预编译然后重新启动服务器的域类。这个   如果服务器运行很长时间,会导致permgen空间耗尽   时间和许多变化。如果是,您可以禁用此功能   对你不重要:

     

grails -Ddisable.auto.recompile = true run-app

     

在Windows上,Grails 0.6也存在问题   OutOfMemoryErrors在开发模式期间的活动期间到期   重新编译。这可以在SVN头中解决,但如果你看到了   这个问题上面的选项也可以帮助。

最简单的方法是在应用程序服务器发生时重新启动它。

答案 3 :(得分:0)

在STS IDE中设置如下:

-XX:MaxPermSize = 512m -XX:PermSize = 128m

enter image description here

我希望它有所帮助。