簡體   English   中英

tomcat7 servlet中的內存泄漏

[英]Memory leak in tomcat7 servlet

我在tomcat7上運行的Web應用程序有問題。

當我嘗試重新啟動Web應用程序時,由我在Servlet中創建的線程打開的端口仍處於打開狀態。

只有找到並殺死Java進程才有幫助。

我在tomcat日志中收到此錯誤消息:

嚴重:Web應用程序[/mdm-server-1.0.0]似乎已啟動名為[com.google.inject.internal.util。$ Finalizer]的線程,但未能停止該線程。 這很可能造成內存泄漏。 2014年11月26日下午1:24:50 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads嚴重:Web應用程序[/mdm-server-1.0.0]似乎已啟動名為[Thread-3]的線程,但失敗了阻止它。 這很可能造成內存泄漏。

該消息似乎導致了guice問題。 我有一個Servlet,它應該等待客戶端連接。 重新部署應用程序后,套接字將保持使用狀態,並且Java線程仍然存在。 難道是因為依賴終止(如guice finalizer)無法終止,所以保持套接字的線程無法停止? 還是我完全走錯了路? 該類及其依賴項不使用guice,而是webapp的一部分。

這是一個jstack輸出,也許有幫助:

“ http-bio-8080-AsyncTimeout”守護程序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”守護程序prio = 10 tid = 0x00007f4ed4206000 nid = 0x71f0 runnable [0x00007f4ecc78f000] java.lang.Thread.State:java.net.PlainSocketImpl.socketAccept(本機方法)處的RUNNABLE org.apache.tomcat.util上的java.net.ServerSocket.implAccept(ServerSocket.java:530)上的.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)在java.net.ServerSocket.accept(ServerSocket.java:498)上。 org.apache.tomcat.util.net.JIoEndpoint $ Acceptor.run(JIoEndpoint.java:216)上的net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:60)在java.lang.Thread.run(Thread.java:745)

“ ContainerBackgroundProcessor [StandardEngine [Tomcat]]”守護程序prio = 10 tid = 0x00007f4ed4205800 nid = 0x71ef等待條件[0x00007f4ecc890000] java.lang.Thread.State:TIMED_WAITING(正在休眠),在java.lang.Thread.sleep(本機方法)處org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.run(ContainerBase.java:1508)在java.lang.Thread.run(Thread.java:745)

“線程4”守護程序prio = 10 tid = 0x00007f4ea00f6800 nid = 0x71ee可運行[0x00007f4ecc991000] java.lang.Thread.State:java.net.PlainSocketImpl.socketAccept(本機方法)處的RUNNABLE,位於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)

Object.wait()中的“ com.google.inject.internal.util。$ Finalizer”守護程序prio = 10 tid = 0x00007f4ea074d000 nid = 0x71ed [0x00007f4ecca92000] java.lang.Thread.State:在Java上等待(在對象監視器上)。 lang.Object.wait(本機方法)-在java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)上等待<0x00000007ea2a9a18>(java.lang.ref.ReferenceQueue $ Lock)-鎖定<0x00000007ea2a9a18>( com.google.inject.internal.util。$ Finalizer.run(Finalizer.java:114)處java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)處的java.lang.ref.ReferenceQueue $ Lock)

“ Thread-3”守護程序prio = 10 tid = 0x00007f4ea1a71800 nid = 0x71ec可運行[0x00007f4eccb93000] java.lang.Thread.State:在sun.nio.ch.EPoll.epollWait(本機方法)處的RUNNABLE在sun.nio.ch.EPollPort sun.nio.ch.EPollPort上的$ EventHandlerTask.poll(EPollPort.java:194)在java.lang.Thread.run(Thread.java:745)上的$ EventHandlerTask.run(EPollPort.java:268)

“ pool-1-thread-5” prio = 10 tid = 0x00007f4ed42fa000 nid = 0x71e9等待條件[0x00007f4ecd41b000] java.lang.Thread.State:在sun.misc.Unsafe.park(本機方法)上等待(停車)-停車在java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)處等待<0x0000000785ed5558>(java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject)在java.util.concurrent.locks.AbstractQueuedSynchronizer $ java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)處的ConditionObject.await(java.util.concurrent.LinkedBlockingQueue.java:442)在java.util.concurrent處的java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)at 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(本機方法)上等待(停車)-停車在java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)處等待<0x0000000785ed5558>(java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject)在java.util.concurrent.locks.AbstractQueuedSynchronizer $ java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)處的ConditionObject.await(java.util.concurrent.LinkedBlockingQueue.java:442)在java.util.concurrent處的java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)at 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(本機方法)處等待(停車)-停車在java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)處等待<0x0000000785ed5558>(java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject)在java.util.concurrent.locks.AbstractQueuedSynchronizer $ java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)處的ConditionObject.await(java.util.concurrent.LinkedBlockingQueue.java:442)在java.util.concurrent處的java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:745)

“ pool-1-thread-2” prio = 10 tid = 0x00007f4ed42de800 nid = 0x71e6等待條件[0x00007f4ecd71e000] java.lang.Thread.State:在sun.misc.Unsafe.park(本機方法)上等待(停車)-停車在java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)處等待<0x0000000785ed5558>(java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject)在java.util.concurrent.locks.AbstractQueuedSynchronizer $ java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)處的ConditionObject.await(java.util.concurrent.LinkedBlockingQueue.java:442)在java.util.concurrent處的java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:745)

“ pool-1-thread-1” prio = 10 tid = 0x00007f4ed42dd800 nid = 0x71e5等待條件[0x00007f4ecd81f000] java.lang.Thread.State:在sun.misc.Unsafe.park(本機方法)上等待(停車)-停車在java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)處等待<0x0000000785ed5558>(java.util.concurrent.locks.AbstractQueuedSynchronizer $ ConditionObject)在java.util.concurrent.locks.AbstractQueuedSynchronizer $ java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)處的ConditionObject.await(java.util.concurrent.LinkedBlockingQueue.java:442)在java.util.concurrent處的java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068) .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:745)

“服務線程”守護程序prio = 10 tid = 0x00007f4ed40a7000 nid = 0x71e1可運行[0x0000000000000000] java.lang.Thread.State:RUNNABLE

“ C2 CompilerThread1”守護程序prio = 10 tid = 0x00007f4ed40a4800 nid = 0x71e0等待條件[0x0000000000000000] java.lang.Thread.State:RUNNABLE

“ C2 CompilerThread0”守護程序prio = 10 tid = 0x00007f4ed40a2000 nid = 0x71df等待條件[0x0000000000000000] java.lang.Thread.State:RUNNABLE

“ JDWP事件幫助器線程”守護程序prio = 10 tid = 0x00007f4ed409f800 nid = 0x71de runnable [0x0000000000000000] java.lang.Thread.State:RUNNABLE

“ JDWP傳輸偵聽器:dt_socket”守護程序prio = 10 tid = 0x00007f4ed409c000 nid = 0x71dd可運行[0x0000000000000000]
java.lang.Thread.State:RUNNABLE

“ Signal Dispatcher”守護程序prio = 10 tid = 0x00007f4ed408f000 nid = 0x71dc等待條件[0x0000000000000000] java.lang.Thread.State:RUNNABLE

Object.wait()中的“ Finalizer”守護程序prio = 10 tid = 0x00007f4ed406e800 nid = 0x71db [0x00007f4ece6b5000] java.lang.Thread.State:在java.lang.Object.wait(本機方法)上等待(在對象監視器上)-等待在java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)的<0x0000000784ccd218>(java.lang.ref.ReferenceQueue $ Lock)上-鎖定<0x0000000784ccd218>(java.lang.ref.ReferenceQueue $ Lock)在java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)在java.lang.ref.Finalizer $ FinalizerThread.run(Finalizer.java:209)

Object.wait()中的“ Reference Handler”守護程序prio = 10 tid = 0x00007f4ed406c800 nid = 0x71da [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)

Object.wait()中的“ main” prio = 10 tid = 0x00007f4ed400d000 nid = 0x71d6 [0x00007f4edacd6000] java.lang.Thread.State:在java.lang.Object.wait(本機方法)上等待(在對象監視器上)-等待<0x00000007eb7da230>(java.lang.Object)在org.apache.tomcat.maven.plugin.tomcat7.run.AbstractRunMojo.waitIndefinitely(AbstractRunMojo.java:1357)在java.lang.Object.wait(Object.java:503) )-在org.apache.maven.plugin.DefaultPluginManager處將<0x00000007eb7da230>(java.lang.Object)鎖定在org.apache.tomcat.maven.plugin.tomcat7.run.AbstractRunMojo.execute(AbstractRunMojo.java:595)處。 org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)處org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:569)處的executeMojo(DefaultPluginManager.java:490) .maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:539)在org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeG 位於org.apache.maven.lifecycle.Defaultcycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)的org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)的oalAndHandleFailures(DefaultLifecycleExecutor.java:387) .maven.DefaultMaven.doExecute(DefaultMaven.java:328)位於org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)位於org.apache.maven.cli.MavenCli.main(MavenCli.java:362) org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60),位於sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法),位於sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)。 org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)上的java.lang.reflect.Method.invoke(Method.java:606)上的reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) .classworlds.Launcher.launch(Launcher.java:255)在org.codehaus.classworlds.Launcher.mainWithExitCode(L auncher.java:430),位於org.codehaus.classworlds.Launcher.main(Launcher.java:375)

“ VM線程” PRIO = 10 tid = 0x00007f4ed4068800 nid = 0x71d9可運行

我將不勝感激。

嘗試在Daemon類的主循環中檢查Thread.isInterrupted() 如果是真的,請中斷循環,這應允許Tomcat成功關閉線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM