【问题标题】:"OutOfMemoryError: PermGen space" with Grails webappsGrails webapps 的“OutOfMemoryError: PermGen space”
【发布时间】:2016-05-03 09:08:55
【问题描述】:

我们的团队使用 Grails(2.3.5 版)已经有不到一年的时间了,管理我们服务器的交付团队几乎没有使用 Grails 编写的应用程序相关的经验。

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

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

我们的印象是,这对于 Grails 应用程序来说是正常的,但没有任何高级 Grails 开发人员,我们无法从经验或更好的知识中确认这一点。 对于 8 个“常规”Grails Web 应用程序,PermGen 中分配的 536Mb 空间是否太少?

更新: 为了具体说明我所说的“常规”,这些都是针对不同服务的前端 + 后端对,其中前端只不过是一个请求列表,一个从零到完成的向导请求、验证数据、持久化数据、调用 Web 服务以获取协议号,并在某些情况下调用外部支付网关。 后端用于管理请求并执行类似的操作。

每个应用程序可能有大约 20 个实体,具有各自的控制器、服务和视图,除此之外,我们还有一些类来处理带有 Spring Security 和外部基础架构的安全性。

【问题讨论】:

  • “常规”Grails 应用程序听起来相当主观。您在 Java/Spring 应用程序中为持久层使用什么?您使用的是哪个版本的 Grails?我预计 536Mb 对于您的设置来说会很低。您是否对 Grails 应用程序进行了负载测试以失败?什么时候会肚子胀?
  • 可能你正在加载的 gsp 文件太大,sitemesh 无法正确解析,从而导致内存不足错误。
  • 将编辑问题以添加一些细节。但是,我们尚未对应用进行负载测试。

标签: grails tomcat7 permgen


【解决方案1】:

就是这样。你基本上有两个选择。

  1. 在 Java 8 上迁移(请参阅 http://www.infoq.com/articles/Java-PERMGEN-Removed
  2. 进一步增加 PermGen 空间。

还有一个快速的背景。与使用 Spring 的常规 Java 不同,Groovy 和 Grails 在运行时生成了相当多的类(GSP 就是一个例子)。 Groovy 本身也会生成大量的类——每个闭包都是一个类。所有这些都给 permgen 带来了压力。

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

【讨论】:

    【解决方案2】:

    我们曾经遇到过类似的问题,因此我们的团队开始为每个应用使用一个 tomcat。我们还将凭据与安全目的分开。现在可以更轻松地管理它们、监控日志和进行定期更新。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2012-11-25
      • 2013-03-08
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多