我有一个Grails应用程序可以完成相当不错的域对象创建和破坏,并且它似乎以非常非常快的速度耗尽了PermGen空间。我做了通常的调整(将PermGen提升到256M,启用了类GC等),但没有骰子。
是否有人愿意推荐一些(希望免费或非常低成本)工具来解决Groovy和/或Java中的这种内存消耗问题?或者您用来解决JVM内存问题的一些技术?
编辑:这是在生产模式下在Tomcat内部署应用程序的时间;我没试过其他容器。即便如此,有一些资源可以追踪问题。
答案 0 :(得分:10)
你试过吗
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
与增加通常的嫌疑人(-Xmx
,-Xms
,-XX:PermSize
和-XX:MaxPermSize
)一起解决了我们生产Tomcat的所有PermGen问题,这些问题很快就出现了部署应用程序后。之后再也没见过另一个OOM-Exception。 : - )
答案 1 :(得分:6)
我个人喜欢VisualVM。肯定有更强大的工具,但是这个工具具有很好的可用性 - 功率比。
答案 2 :(得分:3)
答案 3 :(得分:2)
Eclipse Memory Analyzer是一个免费工具,至少和Yourkit一样好。
答案 4 :(得分:1)
YourKit是一个很好的工具,我多次使用它来诊断内存问题。它是商业性的,但它有一个免费的评估版本可用于一次性调试。
答案 5 :(得分:1)
您在开发或生产中遇到的问题是什么?
如果您正在开发中,请记住Grails不断重新编译应用程序的许多方面(不仅是域更改,还包括控制器更改,以及其他类)。我也有PermGen问题,但大多数是由我正在处理的文件的稳定重新编译触发的。您可以关闭此功能
如果你正在制作,那么显然你有一个更严重的问题。 PermGen内存问题归因于构建Grails的许多框架,包括Spring,Hibernate,甚至是Sun自己的JVM。您可以尝试调整Web容器(Tomcat或Jetty)的最大堆大小。
你也可以尝试不同的JVM实现,比如Oracle的JRockit,它应该在垃圾收集和其他效率方面更好。我自己从未尝试过,但由于我也处于开发和广泛的Grails项目的中间,我可能会自己购买这些问题的解决方案。祝你好运!
答案 6 :(得分:0)
如果在多次热重新部署应用程序后发生这种情况,您可能会受到this Grails bug的影响。 Tomcat FAQ也有几种可能导致PermGen泄漏的原因。