【问题标题】:Memory Leak Grails application in Tomcat 7Tomcat 7 中的内存泄漏 Grails 应用程序
【发布时间】:2014-04-12 17:32:11
【问题描述】:
我在生产中有一个 grails (v2.1.5) 应用程序,它工作正常,我可以毫无问题地重新部署,但我已经更新了应用程序(一些更改),当我部署新战争时,我得到了内存泄漏错误,服务器启动但应用程序不工作(浏览器中的页面只是一个页面),我试图重新启动实例,停止所有服务,....
我只能重新部署旧战争。我该如何解决这个问题?
谢谢。
错误:
2014 年 3 月 9 日下午 4:02:14 org.apache.catalina.core.StandardContext startInternal SEVERE:错误 listenerStart
2014 年 3 月 9 日下午 4:07:17 org.apache.catalina.core.StandardContext startInternal SEVERE: Context [] 由于先前的错误而启动失败
2014 年 3 月 9 日下午 4:07:17 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 严重:Web 应用程序 [] 注册了 JDBC 驱动程序 [com.mysql.jdbc.Driver] 但在Web 应用程序已停止。为防止内存泄漏,已强制注销 JDBC Driver。
2014 年 3 月 9 日下午 4:07:17 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 严重:Web 应用程序 [] 似乎已经启动了一个名为 [Abandoned connection cleanup thread] 的线程,但未能停止它。这很可能会造成内存泄漏。
2014 年 3 月 9 日下午 4:07:17 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 严重:Web 应用程序 [] 似乎已经启动了一个名为 [net.sf.ehcache.CacheManager@61783b69] 的线程,但有未能阻止它。这很可能会造成内存泄漏。
2014 年 3 月 9 日下午 4:07:17 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 严重:Web 应用程序 [] 似乎已经启动了一个名为 [com.padelsix.SecRole.data] 的线程,但未能停下来。这很可能会造成内存泄漏。
【问题讨论】:
标签:
java
tomcat
grails
memory-leaks
【解决方案1】:
您发布的日志不包含问题的根源。这不是内存泄漏。它也与 Grails 无关。任何 java web-app 都可以让 tomcat 记录这个。消息说,它可能导致内存泄漏,但现在不是导致它。
应该有另一条日志指向实际问题。
【解决方案2】:
主要问题不是潜在的内存泄漏,而是日志的第一部分:
2014 年 3 月 9 日下午 4:02:14 org.apache.catalina.core.StandardContext
startInternal SEVERE: 错误 listenerStart
2014 年 3 月 9 日下午 4:07:17 org.apache.catalina.core.StandardContext
startInternal SEVERE: Context [] 由于以前的错误而启动失败
错误“SEVERE: Error listenerStart”通常表示 servlet 上下文侦听器(在启动时运行)中存在错误,导致 webapp 无法启动。
在catalina.out 和localhost.<date>.log 中查找错误。您可能需要启用其他日志记录才能找到此错误的根本原因。谷歌搜索“SEVERE: Error listenerStart”并查找针对您的 Tomcat 版本的具体说明。
【解决方案3】:
Web 应用程序 [/services] 似乎已启动一个名为 [net.sf.ehcache.CacheManager@37ce6a10] 的线程,但未能停止它。这很可能造成内存泄漏。
在我们使用基于注释的配置的基于 groovy 的 Spring Web 应用程序中,解决方案是使用扩展 的类中的上下文注册 net.sf.ehcache.constructs.web.ShutdownListener 类WebApplicationInitializer 通过重写的onStartup() 方法,如下所示:
import net.sf.ehcache.constructs.web.ShutdownListener
import org.springframework.web.WebApplicationInitializer
...
public class CustomWebApplicationInitializer implements WebApplicationInitializer {
...
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
...
createContext(...)
...
}
private AnnotationConfigWebApplicationContext createContext(final Class... annotatedClasses) {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext()
context.register(annotatedClasses)
context.register(ShutdownListener)
return context
}
}