2015-10-11 4 views
0

Я работаю над проектом Spring MVC. Проект все еще находится в разработке, и я получаю это ниже предупреждения в STS, а также если я развертываю войну на своем локальном сервере Tomcat 7.предупреждение при остановке tomcat 7 от com.mchange.v2.async.ThreadPoolAsynchronousRunner

предупреждение на консоли:

ClassLoaderLeakPreventor: Stopping Thread 'Thread[C3P0PooledConnectionPoolManager[identityToken->2ryrk49cntz2wcsrr79v|40b86944]-HelperThread-#2,5,main]' of type com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread running in web app after 5000 ms 
WARN : 13:26:22.626 com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:689) - An Error forced the closing of Thread[C3P0PooledConnectionPoolManager[identityToken->2ryrk49cntz2wcsrr79v|40b86944]-HelperThread-#1,5,main]. Will attempt to reconstruct, but this might mean that something bad is happening. 
java.lang.ThreadDeath 
    at java.lang.Thread.stop(Thread.java:758) 
    at se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventor.stopThreads(ClassLoaderLeakPreventor.java:732) 
    at se.jiderhamn.classloader.leak.prevention.ClassLoaderLeakPreventor.contextDestroyed(ClassLoaderLeakPreventor.java:397) 
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4741) 
    at org.apache.catalina.core.StandardContext$4.run(StandardContext.java:5450) 
    at java.lang.Thread.run(Thread.java:662) 
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5459) 
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) 
    at org.apache.catalina.core.ContainerBase.stopInternal(ContainerBase.java:1072) 
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) 
    at org.apache.catalina.core.ContainerBase.stopInternal(ContainerBase.java:1072) 
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) 
    at org.apache.catalina.core.StandardService.stopInternal(StandardService.java:502) 
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) 
    at org.apache.catalina.core.StandardServer.stopInternal(StandardServer.java:748) 
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225) 
    at org.apache.catalina.startup.Catalina.stop(Catalina.java:693) 
    at org.apache.catalina.startup.Catalina.start(Catalina.java:654) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303) 
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431) 

Я не в состоянии проследить, почему это происходит. На консоли я вижу это предупреждение непрерывно, и сервер tomcat находится в режиме stopping более 10-12 минут.

Мы использовали герметичный погрузчик класса, добавив следующую зависимость в pom.xm

<dependency> 
    <groupId>se.jiderhamn</groupId> 
    <artifactId>classloader-leak-prevention</artifactId> 
    <version>1.8.0</version> 
</dependency> 

Также c3p0 зависимость

<dependency> 
    <groupId>com.mchange</groupId> 
    <artifactId>c3p0</artifactId> 
    <version>0.9.2</version> 
</dependency> 

Почему это говорит что-то плохое происходит в предупреждении? Это серьезная проблема? Как я могу остановить это?

ответ

1

TL; DR: Обновите до c3p0 0.9.5.1, затем установите privilegeSpawnedThreads в положение true и contextClassLoaderSource в library. Убедитесь, что любое веб-приложение, создающее пул c3p0, внутренне закрывает его при отключении веб-приложения.


Docs: См C3P0 документы по этому вопросу, here и here


Длинная версия:

Tomcat сегрегируется веб-приложений развертываний в специальные загрузчики классов. При горячем повторном развертывании код вашего веб-приложения перезагружается в новый ClassLoader, а именно, как ваши изменения кода становятся видимыми без перезапуска всей JVM.

Но старые ClassLoaders не могут быть собраны в мусор, если Threads ссылаются на объекты классов, загруженные этими старыми ClassLoaders.

c3p0 запускает кучу потоков каждый раз, когда инициализируется пул SourceDataSource (когда запрашивается первое подключение). Если загруженный класс веб-приложения провоцирует инициализацию, эти потоки могут начинать загрузку классов с помощью класса ClassLoader для веб-приложений. Если эти потоки остаются живыми при горячем повторном развертывании, они предотвратят сбор мусора устаревшего ClassLoader и вызову утечку памяти. (И старый ClassLoader, и Zombie Threads будут бесполезно сохранены.) Это плохо, что происходит в вашем случае. В конце концов, после некоторого количества перераспределений вы увидите OutOfMemoryErrors, и все станет чересчур.

К счастью, нетрудно справиться с этим. Несколько предложений:

Независимо от того, не забудьте объединить свой пул соединений последовательно.

  • Если пул соединения будет полностью частной в веб-приложение, а это означает, что бассейн будет запущен в веб-приложение, будет использоваться только, что веб-приложение, и библиотеки C3P0 будет жить в каталог WEB-INF/lib веб-приложения, то убедитесь, что ваше веб-приложение также вызывает close() в пуле до любого удаления, что приведет к завершению работы потоков Thread. Лучший способ добиться этого - с ServletContextListener. Запустите свой пул в contextInitialized(...) и close() в contextDestroyed(...).
  • Если пул соединений будет ресурсом сервера приложений, возможно, настроен в конфигурационных файлах Tomcat, а не создан в коде, то убедитесь, что библиотеки c3p0 (оба файла jar) размещены там, где они будут загружены совместно используемым ClassLoader. Чаще всего это libdirectory of the top-level Tomcat installation.

В любом случае, вы хотите обновления до c3p0-0.9.5 или выше (текущая версия производства 0.9.5.1), а затем установите следующие параметры конфигурации C3P0 взять хаотичность из какие ClassLoader C3P0-внутренняя Темы приходят справки:

Надеюсь, это поможет!

+0

Ваше первое предложение помогло много :) – Amogh

Смежные вопросы