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.outlocalhost.<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

Grails/Groovy 内存泄漏故障排除?

潜在的弹簧安全内存泄漏

Servlet“已启动一个线程但未能停止它”-Tomcat 中的内存泄漏

如何在 Tomcat 7 上部署 Grails 3 应用程序?

Tomcat如何检测内存泄漏