Как решить проблемы с утечкой памяти?

У меня проблема с некоторым потоком и утечкой памяти... В журнале моего 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-файла, исходного кода которого у меня нет, и я не могу изменить его самостоятельно.

Есть ли способ ее решить или хотя бы понять, что идет не так?

Спасибо


person rascio    schedule 16.05.2012    source источник
comment
Когда-то была такая же проблема, решения не нашел, но все равно работало нормально. Кто-нибудь знает, повлияет ли удаление размера файла войны?   -  person marko    schedule 16.05.2012


Ответы (2)


Первая строка указывает на ошибку в драйвере MySQL JDBC. Похоже, это было исправлено в версии 5.1.6 — см. http://bugs.mysql.com/bug.php?id=36565, поэтому вы можете попробовать заменить банку последней из http://dev.mysql.com/downloads/connector/j/

Другие строки указывают, что ThreadPool был запущен и не остановлен при остановке приложения. Это действительно можно исправить, только изменив исходный код стороннего jar-файла, если проблема именно в нем.

Если возможно, вы можете попробовать временно удалить стороннюю банку, чтобы увидеть, исчезнет ли проблема.

person GreyBeardedGeek    schedule 16.05.2012
comment
Приветствую человека! Но есть ли какой-нибудь инструмент, который я могу использовать, чтобы найти проблему? Я также не знаю, какой компонент создает ThreadPool или что-то, что может помочь мне найти, что следует изменить в исходном коде? - person rascio; 16.05.2012
comment
Я обновил драйвер mysql jdbc до последней версии, но это не решило проблему. Я все еще получаю ту же ошибку MySql. - person ishan; 17.07.2012
comment
ошибка MySQL решение: обновление mysql до версии 5.1.27 или выше - person Naman Gala; 06.05.2015
comment
К сожалению, вторая ссылка показывает только версию 5.1.45; не уверен, почему 5.1.6 не был выпущен. - person FractalBob; 18.01.2018
comment
5.1.6 НЕ доступен по указанной выше ссылке, только 5.1.45. - person FractalBob; 18.01.2018
comment
@FractalBob - правда? Как удивительно, что более 5 лет спустя первоначально процитированная версия не является последней... - person GreyBeardedGeek; 19.01.2018

Для проблемы ThreadPool решение, которое я использовал (и оно, похоже, работает), было:

  • Я создал ServletContextListener
  • в методе contextDestroyed с помощью отражения я вызываю метод close источника данных - в моем случае он вроде работает с c3p0 и DBCP
  • для c3p0, я думаю, следует также вызвать статический метод com.mchange.v2.c3p0.DataSources.destroy (dataSource);
person Marian Ion    schedule 27.07.2012