" OutOfMemoryError:PermGen space"使用Grails webapps

时间:2016-01-26 17:28:42

标签: grails tomcat7 permgen

我们的团队一直在与Grails(版本2.3.5)合作一年不到一年,管理我们服务器的交付团队几乎没有与使用Grails编写的应用程序相关的经验。

我们在测试和生产环境中有几个Tomcat 7实例,并且有一定数量的webapps。虽然一些仅包含用Java开发的webapps(带有Spring,Hibernate)的实例有时可以达到类似20个上下文而没有重大问题,但似乎任何过去6 Grails应用程序(与Java对应程序很相似的应用程序)都会定期启动造成可怕的PermGen空间问题。

分配的PermGen目前为536Mb,交付团队显然建议为新应用程序使用单独的实例,或增加分配的内存;与此同时,他们敦促我们验证这些应用程序如何使内存饱和。

我们的印象是Grails应用程序这是正常的,但没有任何Grails高级开发人员,我们无法从经验或更好的知识中确认它。 PermGen为8"常规"分配的空间是536Mb太少Grails webapps?

更新: 为了说明我的意思"常规",这些都是前端+后端的夫妇,用于不同的服务,前端只有一个请求列表,一个向导去从零到完成的请求,验证数据,持久化,调用Web服务以获取协议号,并在一些情况下调用外部支付网关。 后端用于管理请求并执行类似的操作。

每个应用程序可能包含大约20个具有相应控制器,服务和视图的实体,最重要的是我们有几个类来处理带有Spring Security和外部基础结构的安全性。

2 个答案:

答案 0 :(得分:2)

那是怎么回事。你基本上有两个选择。

  1. 迁移Java 8(请参阅http://www.infoq.com/articles/Java-PERMGEN-Removed
  2. 进一步增加PermGen空间。
  3. 快速的背景。与使用Spring的常规Java不同,Groovy和Grails在运行时生成了很多类(GSP就是一个例子)。 Groovy本身也会产生大量的类 - 每个闭包都是一个类。所有这些都给permgen带来了压力。

    为了减轻压力,摆脱所有不必要的插件,整合GSP,重新考虑闭包,只在绝对需要时使用AOP等。

答案 1 :(得分:1)

我们曾经有类似的问题,所以我们的团队开始每个应用程序使用一个tomcat。我们还将凭证与安全目的分开。现在,管理它们,监控日志和定期更新更容易。

提示:训练管理员创建用户,使用tomcats实例的home_dirs并仅提供凭据更容易(imho和更干净)。