Утечка памяти в сервлете tomcat7

1

У меня проблема с веб-приложением, работающим на tomcat7.

Когда я пытаюсь перезапустить веб-приложение, порт, открытый потоком, который я создаю внутри сервлета, по-прежнему открыт.

Помогает только поиск и убийство процесса java.

Я получаю это сообщение об ошибке в журнале tomcat:

SEVERE: Веб-приложение [/mdm-server-1.0.0], похоже, запустило поток с именем [com.google.inject.internal.util. $ Finalizer], но не смог его остановить. Вероятно, это приведет к утечке памяти. 26 ноября 2014 г. 1:24:50 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads SEVERE: веб-приложение [/mdm-server-1.0.0] похоже, начало поток с именем [Thread-3], но не удалось чтобы остановить его. Вероятно, это приведет к утечке памяти.

Похоже, что сообщение приводит к возникновению проблемы. У меня есть Servlet, который должен ждать клиентских подключений. Когда приложение повторно развернуто, сокет остается в использовании, и поток java выживает. Может ли быть, что нить, удерживающая сокет, не может быть остановлена, так как депансидент, как и финализатор, не может быть прекращен? Или я совсем не туда? Класс и его зависимости не используют guice, а являются частью webapp.

Вот результат jstack, возможно, это помогает:

"http-bio-8080-AsyncTimeout" daemon prio = 10 tid = 0x00007f4ed42e2800 nid = 0x71f1 в ожидании состояния [0x00007f4ecc68e000]
java.lang.Thread.State: TIMED_WAITING (сон) в java.lang.Thread.sleep (собственный метод) в org.apache.tomcat.util.net.JIoEndpoint $ AsyncTimeout.run(JIoEndpoint.java:148) в java. lang.Thread.run(Thread.java:745)

"http-bio-8080-Acceptor-0" daemon prio = 10 tid = 0x00007f4ed4206000 nid = 0x71f0 runnable [0x00007f4ecc78f000] java.lang.Thread.State: RUNNABLE на java.net.PlainSocketImpl.socketAccept (собственный метод) на java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) в java.net.ServerSocket.implAccept(ServerSocket.java:530) в java.net.ServerSocket.accept(ServerSocket.java:498) на org.apache.tomcat.util. net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60) на org.apache.tomcat.util.net.JIoEndpoint $ Acceptor.run(JIoEndpoint.java:216) на java.lang.Thread.run(Thread.java:745)

"ContainerBackgroundProcessor [StandardEngine [Tomcat]]" daemon prio = 10 tid = 0x00007f4ed4205800 nid = 0x71ef ожидание при условии [0x00007f4ecc890000] java.lang.Thread.State: TIMED_WAITING (сон) в java.lang.Thread.sleep(Native Method) в org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.run(ContainerBase.java:1508) в java.lang.Thread.run(Thread.java:745)

"Thread-4" daemon prio = 10 tid = 0x00007f4ea00f6800 nid = 0x71ee runnable [0x00007f4ecc991000] java.lang.Thread.State: RUNNABLE на java.net.PlainSocketImpl.socketAccept (собственный метод) на java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java: 398) на java.net.ServerSocket.implAccept(ServerSocket.java:530) на java.net.ServerSocket.accept(ServerSocket.java:498) на testproject.server.device.AcceptConnectionDaemon.run(AcceptConnectionDaemon.java: 39) в java.lang.Thread.run(Thread.java:745)

"com.google.inject.internal.util. $ Finalizer" daemon prio = 10 tid = 0x00007f4ea074d000 nid = 0x71ed в Object.wait() [0x00007f4ecca92000] java.lang.Thread.State: WAITING (на мониторе объекта) в java. lang.Object.wait(Native Method) - ожидание <0x00000007ea2a9a18> (java.lang.ref.ReferenceQueue $ Lock) в java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - заблокировано <0x00000007ea2a9a18> ( java.lang.ref.ReferenceQueue $ Lock) в java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) в com.google.inject.internal.util. $ Finalizer.run(Finalizer.java:114)

"Thread-3" daemon prio = 10 tid = 0x00007f4ea1a71800 nid = 0x71ec runnable [0x00007f4eccb93000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPoll.epollWait (собственный метод) на sun.nio.ch.EPollPort $ EventHandlerTask.poll(EPollPort.java:194) на sun.nio.ch.EPollPort $ EventHandlerTask.run(EPollPort.java:268) в java.lang.Thread.run(Thread.java:745)

"pool-1-thread-5" prio = 10 tid = 0x00007f4ed42fa000 nid = 0x71e9 Ожидание при условии [0x00007f4ecd41b000] java.lang.Thread.State: WAITING (парковка) на sun.misc.Unsafe.park (собственный метод) - парковка ожидать <0x0000000785ed5558> (java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject) в java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) в java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await(AbstractQueuedSynchronizer.java:2043) в java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) в java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) в java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:745)

"pool-1-thread-4" prio = 10 tid = 0x00007f4ed4288800 nid = 0x71e8 Ожидание при условии [0x00007f4ecd51c000] java.lang.Thread.State: ОЖИДАНИЕ (парковка) на sun.misc.Unsafe.park (собственный метод) - парковка ожидать <0x0000000785ed5558> (java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject) в java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) в java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await(AbstractQueuedSynchronizer.java:2043) в java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) в java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) в java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:745)

"pool-1-thread-3" prio = 10 tid = 0x00007f4e90001800 nid = 0x71e7 Ожидание при условии [0x00007f4ecd61d000] java.lang.Thread.State: ОЖИДАНИЕ (парковка) на sun.misc.Unsafe.park (собственный метод) - парковка ожидать <0x0000000785ed5558> (java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject) в java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) в java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await(AbstractQueuedSynchronizer.java:2043) в java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) в java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) в java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:745)

"pool-1-thread-2" prio = 10 tid = 0x00007f4ed42de800 nid = 0x71e6 Ожидание при условии [0x00007f4ecd71e000] java.lang.Thread.State: WAITING (парковка) на sun.misc.Unsafe.park (собственный метод) - парковка ожидать <0x0000000785ed5558> (java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject) в java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) в java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await(AbstractQueuedSynchronizer.java:2043) в java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) в java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) в java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:745)

"пул-1-нить-1" prio = 10 tid = 0x00007f4ed42dd800 nid = 0x71e5, ожидающий состояния [0x00007f4ecd81f000] java.lang.Thread.State: WAITING (парковка) на sun.misc.Unsafe.park (собственный метод) - парковка ожидать <0x0000000785ed5558> (java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject) в java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) в java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject.await(AbstractQueuedSynchronizer.java:2043) в java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442) в java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) в java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:745)

"Сервисный поток" daemon prio = 10 tid = 0x00007f4ed40a7000 nid = 0x71e1 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" daemon prio = 10 tid = 0x00007f4ed40a4800 nid = 0x71e0 Ожидание при условии [0x0000000000000000] java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" daemon prio = 10 tid = 0x00007f4ed40a2000 nid = 0x71df Ожидание при условии [0x0000000000000000] java.lang.Thread.State: RUNNABLE

"JDWP Event Helper Thread" daemon prio = 10 tid = 0x00007f4ed409f800 nid = 0x71de runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE

"JDWP Transport Listener: dt_socket" daemon prio = 10 tid = 0x00007f4ed409c000 nid = 0x71dd runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Диспетчер сигналов" daemon prio = 10 tid = 0x00007f4ed408f000 nid = 0x71dc Ожидание при условии [0x0000000000000000] java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio = 10 tid = 0x00007f4ed406e800 nid = 0x71db в Object.wait() [0x00007f4ece6b5000] java.lang.Thread.State: WAITING (на мониторе объекта) в java.lang.Object.wait(Native Method) - ожидание на <0x0000000784ccd218> (java.lang.ref.ReferenceQueue $ Lock) в java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - заблокирован <0x0000000784ccd218> (java.lang.ref.ReferenceQueue $ Lock) в java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) в java.lang.ref.Finalizer $ FinalizerThread.run(Finalizer.java:209)

"Обработчик ссылок" daemon prio = 10 tid = 0x00007f4ed406c800 nid = 0x71da в Object.wait() [0x00007f4ece7b6000] java.lang.Thread.State: WAITING (на мониторе объекта) в java.lang.Object.wait (собственный метод) - Ожидание на <0x0000000784cccd80> (java.lang.ref.Reference $ Lock) в java.lang.Object.wait(Object.java:503) в java.lang.ref.Reference $ ReferenceHandler.run(Reference.java:133 ) - заблокировано <0x0000000784cccd80> (java.lang.ref.Reference $ Lock)

"main" prio = 10 tid = 0x00007f4ed400d000 nid = 0x71d6 в Object.wait() [0x00007f4edacd6000] java.lang.Thread.State: WAITING (на мониторе объекта) в java.lang.Object.wait (собственный метод) - ожидание <0x00000007eb7da230> (java.lang.Object) в java.lang.Object.wait(Object.java:503) на org.apache.tomcat.maven.plugin.tomcat7.run.AbstractRunMojo.waitIndefinitely(AbstractRunMojo.java:1357 ) - заблокирован <0x00000007eb7da230> (java.lang.Object) на org.apache.tomcat.maven.plugin.tomcat7.run.AbstractRunMojo.execute(AbstractRunMojo.java:595) в org.apache.maven.plugin.DefaultPluginManager. executeMojo (DefaultPluginManager.java:490) в org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694) в org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569) в org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539) на org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeG oalAndHandleFailures (DefaultLifecycleExecutor.java:387) в org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348) в org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180) на org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328) в org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138) на org.apache.maven.cli.MavenCli.main(MavenCli.java:362) at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60) на sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) на sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) на солнце. отразить.ДелегированиеMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke(Method.java:606) в org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315) в org.codehaus.classworlds.Launcher.launch(Launcher.java:255) в org.codehaus.classworlds.Launcher.mainWithExitCode(L auncher.java:430) на org.codehaus.classworlds.Launcher.main(Launcher.java:375)

"VM Thread" prio = 10 tid = 0x00007f4ed4068800 nid = 0x71d9 runnable

Я был бы признателен за любую помощь.

Теги:
servlets
tomcat
memory-leaks

1 ответ

1
Лучший ответ

Попробуйте проверить Thread.isInterrupted() в главном цикле вашего класса Daemon. Разрыв цикла, если он верен, и он должен позволить Tomcat успешно завершить ваши потоки.

  • 0
    Я добавил еще немного информации. isInterrupted - это bool Thread.interrupted прямо сейчас, верно? Из документации java я воспользовался советом, чтобы немедленно выдать соответствующее исключение без успеха.
  • 0
    Вам не нужно выбрасывать исключение, этого должно быть достаточно, чтобы вырваться из цикла. Вы можете просто сделать это, while (!interrupted()){...} . Но, с другой стороны, я не думаю, что разница имеет решающее значение, поэтому ваша проблема, вероятно, где-то еще.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню