我有一个部署在Tomcat 6服务器上的Grails应用程序。应用程序可以运行一段时间(一天或两天),但随着时间的推移慢慢消耗越来越多的内存,直到它停止运行然后超过最大值。一旦我重新启动容器,一切都很好。我一直在使用grails JavaMelody插件以及Application Info插件验证这一点,但我需要帮助来确定我应该寻找什么。
这听起来像应用程序泄漏,但据我所知,无法访问任何非托管资源。此外,Hibernate缓存似乎正在检查中。看起来如果我运行垃圾收集器,我得到了相当大的内存,但我不知道如何以可持续的方式做到这一点。
所以:
非常感谢。
修改
我正在使用Grails 1.3.7并且我正在使用Quartz插件。
答案 0 :(得分:2)
您可以使用Oracle JDK中的VisualVM应用程序在运行时附加到Tomcat实例(如果已使用Oracle JVM)以检查发生了什么。内存分析器可以告诉你很多,并指出你正确的方向。您很可能会寻找增长的对象或分配越来越多的对象类型。
如果您需要的不仅仅是免费的VisualVM应用程序可以告诉您,商业分析器可能会有用。
答案 1 :(得分:1)
根据您对Quartz的使用情况,它可能与持久性和线程局部的a know memory leak with the Quartz plugin直接相关。您可能需要仔细检查并查看这是否适用于您的情况。