Grails/Groovy 内存泄漏故障排除?
Posted
技术标签:
【中文标题】Grails/Groovy 内存泄漏故障排除?【英文标题】:Troubleshooting Grails/Groovy memory leaks? 【发布时间】:2010-10-17 06:22:42 【问题描述】:我有一个 Grails 应用程序,它可以创建和销毁相当数量的域对象,而且它似乎以非常非常快的速度耗尽 PermGen 空间。我已经完成了通常的调整(将 PermGen 提高到 256M,启用类 GC 等),但没有骰子。
是否有人愿意推荐一些(希望是免费或非常低成本的)工具来解决 Groovy 和/或 Java 中的这种内存消耗问题?或者您用来解决 JVM 内存问题的一些技术?
编辑:这是当应用程序以生产模式部署在 Tomcat 中时;我没有尝试过其他容器。即便如此,如果能有一些资源来追踪问题,那就太好了。
【问题讨论】:
您最终是如何解决您的问题的?我们使用可搜索和石英(以及其他插件),并且几乎每次请求都会增加我们的PERMGEN 空间使用量。 【参考方案1】:你试过了吗
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
?
加上增加常见的嫌疑人(-Xmx
、-Xms
、-XX:PermSize
和 -XX:MaxPermSize
),这解决了我们的生产 Tomcat 上的所有 PermGen 问题,这些问题在部署应用程序后不久就发生了。在那之后再也没有见过另一个OOM-Exception。 :-)
【讨论】:
此解决方案是否存在任何与性能相关的问题?我们正在使用可搜索、可审计和石英插件来处理大量经常性工作,并且每周都会获得 PermGen OOM...【参考方案2】:我个人喜欢VisualVM。周围肯定有更强大的工具,但这个工具的可用性与功率比很好。
【讨论】:
【参考方案3】:这也很有用: http://burtbeckwith.com/blog/?p=73
【讨论】:
【参考方案4】:Eclipse Memory Analyzer 是一个免费工具,至少和 Yourkit 一样好。
【讨论】:
【参考方案5】:YourKit 是一个很好的工具,我曾多次使用它来诊断内存问题。它是商业的,但它有一个免费的评估版,可用于一次性调试。
【讨论】:
【参考方案6】:您遇到的问题是在开发还是生产中?
如果您正在开发,请记住 Grails 会不断地重新编译应用程序的许多方面(不仅是域更改,还包括控制器更改以及其他类)。我也有 PermGen 问题,但大多数是由我正在处理的文件的稳定重新编译触发的。您可以关闭此功能
http://www.grails.org/FAQ#Q:%20OMG%20I%20get%20OutOfMemoryErrors%20or%20PermGen%20Space%20errors%20when%20running%20Grails%20in%20development%20mode.%20What%20do%20I%20do?
如果您在生产中,那么显然您遇到的问题要严重得多。 PermGen 内存问题归因于构建 Grails 的许多框架,包括 Spring、Hibernate,甚至 Sun 自己的 JVM。您可以尝试调整 Web 容器(Tomcat 或 Jetty)的最大堆大小。
您还可以尝试不同的 JVM 实现,例如 Oracle 的 JRockit,它应该在垃圾收集和其他效率方面要好得多。我自己从未尝试过,但由于我也在开发和广泛的 Grails 项目中,我可能自己购买这些问题的解决方案。祝你好运!
【讨论】:
JRockit 是 Oracle 产品 oracle.com/technology/software/products/jrockit/index.html 我在 Tomcat (6.0.18) 上以生产模式运行,对于 JVM 并没有真正的选择。 我读过Web 容器中垃圾收集的一个问题是堆栈只有在容器重新启动时才会真正刷新。 (重启容器相当于重启Tomcat服务,而不是简单的重启单个Web应用。)【参考方案7】:如果在您多次热重新部署应用程序后发生这种情况,您可能会受到this Grails bug 的影响。 Tomcat FAQ 也有几个可能导致 PermGen 泄漏的原因。
【讨论】:
我实际上认为这是根本问题(应用程序在 Jetty 中运行良好),但即便如此,我还是希望有一个很好的资源来进行这种调试。以上是关于Grails/Groovy 内存泄漏故障排除?的主要内容,如果未能解决你的问题,请参考以下文章