如何解决内存泄漏问题?

3

我有一个线程和内存泄漏的问题...在我的Tomcat7日志中,我发现我的Grails应用程序有以下行:

SEVERE: The web application [/myApp] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.
May 16, 2012 6:02:10 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/myApp] appears to have started a thread named [pool-63-thread-1] but has failed to stop it. This is very likely to create a memory leak.
May 16, 2012 6:02:10 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/myApp] appears to have started a thread named [pool-63-thread-2] but has failed to stop it. This is very likely to create a memory leak.
May 16, 2012 6:02:10 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/myApp] appears to have started a thread named [pool-63-thread-3] but has failed to stop it. This is very likely to create a memory leak.
May 16, 2012 6:02:10 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/myApp] appears to have started a thread named [pool-63-thread-4] but has failed to stop it. This is very likely to create a memory leak.
May 16, 2012 6:02:10 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/myApp] appears to have started a thread named [pool-63-thread-5] but has failed to stop it. This is very likely to create a memory leak.
May 16, 2012 6:02:10 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/myApp] appears to have started a thread named [pool-63-thread-6] but has failed to stop it. This is very likely to create a memory leak.
May 16, 2012 6:02:10 AM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/myApp] appears to have started a thread named [pool-63-thread-7] but has failed to stop it. This is very likely to create a memory leak.

还有更多这样的问题...

问题在于我认为所有这些线程都是在应用程序的某个部分中创建的,该部分由第三方JAR开发,我没有源代码,也无法自行修改。

有没有解决方法,或者至少了解出了什么问题?

谢谢


曾经遇到过同样的问题,但没有找到解决方案,但它仍然可以正常工作。有人知道剥离war文件大小是否会产生任何影响吗? - marko
2个回答

4
第一行指的是MySQL JDBC驱动程序中的一个错误。看起来在5.1.6中已经修复 - 可以查看http://bugs.mysql.com/bug.php?id=36565,因此您可以尝试使用最新的jar文件替换它,该文件可从http://dev.mysql.com/downloads/connector/j/下载。
其他行指示启动了线程池,并且在应用程序停止时未停止。如果问题出在第三方jar包中,则只能通过修改其源代码来解决。
如果可能,您可以尝试暂时消除第三方jar包,以查看问题是否消失。

兄弟,谢谢!但是有没有什么工具可以帮我找到问题出在哪里?我也不知道如何查看哪个组件创建了线程池或其他可以帮助我找到源代码中应该更改的内容的东西。 - rascio
我将mysql jdbc驱动程序更新到了最新版,但并没有解决问题。我仍然收到相同的MySql错误提示。 - ishan
MYSQL bug 解决方案:升级 MySQL 到 5.1.27 版本或更高版本。 - Naman Gala
不幸的是,第二个链接只显示版本5.1.45;不确定为什么没有发布5.1.6。 - FractalBob
以上链接中并没有提供5.1.6版本,只有5.1.45版本。 - FractalBob
1
@FractalBob - 真的吗?令人惊讶的是,五年后,最初引用的版本仍然不是最新版本... - GreyBeardedGeek

2
对于线程池问题,我使用的解决方法(似乎有效)是:
  • 我创建了一个ServletContextListener
  • contextDestroyed方法中,通过反射调用DataSource的close方法 - 在我的情况下,它似乎可以与c3p0和DBCP一起使用
  • 对于c3p0,我认为还应该调用静态方法com.mchange.v2.c3p0.DataSources.destroy(dataSource);
请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接