Tomcat 7 中的内存泄漏 Grails 应用程序
Posted
技术标签:
【中文标题】Tomcat 7 中的内存泄漏 Grails 应用程序【英文标题】:Memory Leak Grails application in Tomcat 7 【发布时间】: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] 的线程,但未能停下来。这很可能会造成内存泄漏。
【问题讨论】:
【参考方案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
【讨论】:
以上是关于Tomcat 7 中的内存泄漏 Grails 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
停止/重新部署时 Tomcat 7+ 内存泄漏。弹簧数据,JPA,休眠,MySQL
Servlet“已启动一个线程但未能停止它”-Tomcat 中的内存泄漏