我有一个基本的应用程序,当我使用grails run-app
运行它时工作正常,我想使用grails run-war
运行它。但是,在任何请求之后,我总是在启动后得到着名的tomcat java.lang.OutOfMemoryError: PermGem space
错误。
嗯,我知道我需要更改PermSize
值,因此我尝试了在google搜索后找到的所有方式(JAVA_OPTS
,GRAILS_OPTS
和grails.tomcat.jvmArgs
) ,现在我有以下脚本:
export JAVA_OPTS="-Xms256m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m"
export GRAILS_OPTS="-Xms256m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m"
grails -Dgrails.tomcat.jvmArgs="-Xms256m -Xmx1024m -XX:PermSize=512m -XX:MaxPermSize=512m" run-war
但它没有帮助。第一次请求时仍然有java.lang.OutOfMemoryError: PermGen space
。
我做错了什么?有没有其他方法可以为Grails 2.0.1配置PermSize
?
更新:我运行ps -ef | grep java
并发现Grails实际上得到了我的参数,但是它为tomcat运行了一个新进程,没有这个参数。
答案 0 :(得分:13)
发现必须在BuildConfig.groovy
配置
grails.tomcat.jvmArgs= ["-Xms256m", "-Xmx1024m", "-XX:PermSize=512m", "-XX:MaxPermSize=512m"]
现在它工作正常。
答案 1 :(得分:1)
看起来你得到了grails.tomcat.jvmArgs
的正确信息,为了将来参考,使用JDK附带的2个命令可以很容易地判断jvm进程正在运行什么标志。 jps
显示了使用java运行的所有进程(通过常规ps
比较容易找到grails进程,jinfo <PID>
将为正在运行的JVM进程转储所有系统属性和标志(包括内存args)。它可以很容易地看到一个进程是否正在运行你想要的所有值。