Grails / Groovy内存泄漏疑难解答?

我有一个Grails应用程序,它做了相当不错的领域对象创建和破坏,它似乎以非常非常快的速度耗尽了PermGen空间。 我做了通常的调整(碰到PermGen到256M,启用了类GC等),但没有骰子。

是否有人愿意推荐一些(并希望免费或非常低成本)工具来解决Groovy和/或Java中的这种内存消耗? 或者您用来解决JVM内存问题的一些技巧?

编辑:这是在生产模式下在Tomcat内部署应用程序的时间; 我没试过其他容器。 即便如此,拥有一些资源来追踪问题会很好。

你有没有尝试过

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled 

与增加通常的嫌疑人( -Xmx-Xms-XX:PermSize-XX:MaxPermSize )一起解决了我们生产的Tomcat上的所有PermGen问题,这些问题在部署应用程序后很快就出现了。 之后再也没见过另一个OOM-Exception。 🙂

我个人喜欢VisualVM 。 肯定有更强大的工具,但是这个工具具有很好的可用性 – 功率比。

这也很有用: http : //burtbeckwith.com/blog/?p = 73

Eclipse Memory Analyzer是一个免费的工具,至少和Yourkit一样好。

YourKit是一个很好的工具,我多次使用它来诊断内存问题。 它是商业性的,但它有一个免费的评估版本可用于一次性调试。

您在开发或生产中遇到的问题是什么?

如果您正在开发中,请记住Grails不断重新编译应用程序的许多方面(不仅是域更改,还包括控制器更改,以及其他类)。 我也有PermGen问题,但大多数是由我正在处理的文件的稳定重新编译触发的。 您可以关闭此function

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项目的中间,我可能会自己购买这些问题的解决方案。 祝你好运!

如果在您多次热重新部署应用程序后发生这种情况,您可能会受到此Grails错误的影响。 Tomcat FAQ还有几个可能导致PermGen泄漏的原因。