Grails和PermGen问题与g:link和g:render

时间:2010-04-22 17:28:27

标签: java grails jvm

我一直在运行grails而没有任何问题,但最近在升级到Grails 1.1.1之后,我遇到了可怕的PermGen错误。在升级之前,没有这样的问题。

在GSP中使用<g:link><g:render>标记时似乎发生了错误,但我不确定这是否表明这是问题,但更多的是它用尽了在渲染这些标签时的空间。

通常,遇到PermGen错误的每个人都建议增加您的Java环境选项 - 但问题的根源可能是什么?它是Grails 1.1 / hibernate / spring问题吗?

错误:

2010-04-20 05:37:03,962 INFO  [STDOUT] 05:37:03,961 ERROR [GroovyPagesServlet] Error processing GSP: 
Error executing tag <g:render>: org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: 
Error executing tag <g:link>: java.lang.OutOfMemoryError: PermGen space 
org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: 
Error executing tag <g:render>: 
org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: 
Error executing tag <g:link>: java.lang.OutOfMemoryError: PermGen space

2 个答案:

答案 0 :(得分:2)

大型PermGen空间要求是Grails在开发模式下提供的自动重新编译功能的结果。必须增加PermGen空间是一个非常非常小的价格,以支付即时重新编译。 Grails生产模式中不会出现此问题。对大型PermGen的需求是因为Java将类信息存储在称为PermGen的内存部分中。这个内存区域与堆和内存的其他部分完全不同。 (增加堆空间不会增加PermGen大小)。当Grails重新编译一个类时,它会导致将一个新类添加到PermGen(而不是替换现有的类信息)。当您在devel模式下进行更多更改时,会消耗越来越多的PermGen内存。

答案 1 :(得分:1)

上面的好解释......尝试通过

增加它
export JAVA_OPTS="-Xms256m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m"