![](/img/trans.png)
[英]Servlet “has started a thread but failed to stop it” - memory leak in Tomcat
[英]Tomcat webapp error - application started thread [AWT-Windows] but has failed to stop it - memory leak?
直到今天,在我的PC上進行本地測試時,我才注意到它,即Tomcat在日志文件中發布了錯誤。 我正在使用Tomcat 6.0.29和Java JDK 1.6。
Dec 1, 2010 12:36:57 pm org.apache.catalina.core.StandardContext reload INFO: Reloading this Context has started Dec 1, 2010 12:36:57 pm org.apache.catalina.loader.WebappClassLoader clearReferencesThreads SEVER: The web application [/AutoSpyder] appears to have started a thread named [AWT-Windows] but has failed to stop it. This is very likely to create a memory leak.
什么? 我以前從未見過這個。 因此,我從昨天開始檢查了我的日志文件,當然,這個錯誤也在那里。 我不太明白是什么原因造成的。
我是否可以假定它必須是使用java.awt
包中的對象的servlet之一? 如果是這樣,我如何查明導致這種情況的代碼?
2010-12-01 14:28:18 Full thread dump Java HotSpot(TM) Client VM (17.1-b03 mixed mode, sharing): "JMX server connection timeout 34" daemon prio=6 tid=0x03069400 nid=0x960 in Object.wait() [0x0461f000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a [I) at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(ServerCommunicatorAdmin.java:150) - locked (a [I) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "RMI Scheduler(0)" daemon prio=6 tid=0x03069000 nid=0xe88 waiting on condition [0x045cf000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025) at java.util.concurrent.DelayQueue.take(DelayQueue.java:164) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:609) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:602) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "RMI TCP Connection(1)-192.168.0.102" daemon prio=6 tid=0x0308a400 nid=0xebc runnable [0x0457f000] java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:129) at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) at java.io.BufferedInputStream.read(BufferedInputStream.java:237) - locked (a java.io.BufferedInputStream) at java.io.FilterInputStream.read(FilterInputStream.java:66) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:517) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - (a java.util.concurrent.locks.ReentrantLock$NonfairSync) "RMI TCP Accept-0" daemon prio=6 tid=0x039e0c00 nid=0xc68 runnable [0x0452f000] java.lang.Thread.State: RUNNABLE at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390) - locked (a java.net.SocksSocketImpl) at java.net.ServerSocket.implAccept(ServerSocket.java:453) at java.net.ServerSocket.accept(ServerSocket.java:421) at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:34) at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:369) at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:341) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "AWT-Windows" daemon prio=6 tid=0x02b65400 nid=0x7c4 runnable [0x042cf000] java.lang.Thread.State: RUNNABLE at sun.awt.windows.WToolkit.eventLoop(Native Method) at sun.awt.windows.WToolkit.run(WToolkit.java:293) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "Java2D Disposer" daemon prio=10 tid=0x02fccc00 nid=0x93c in Object.wait() [0x039df000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) - locked (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at sun.java2d.Disposer.run(Disposer.java:127) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "http-8080-6" daemon prio=6 tid=0x03322800 nid=0xfec in Object.wait() [0x0395f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458) - locked (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "http-8080-5" daemon prio=6 tid=0x02ba5c00 nid=0xdbc in Object.wait() [0x0390f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458) - locked (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "http-8080-4" daemon prio=6 tid=0x02ff6400 nid=0xa1c in Object.wait() [0x038bf000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458) - locked (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "http-8080-3" daemon prio=6 tid=0x0317e400 nid=0x850 in Object.wait() [0x0386f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458) - locked (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "http-8080-2" daemon prio=6 tid=0x03314800 nid=0xf9c in Object.wait() [0x0381f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458) - locked (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "http-8080-1" daemon prio=6 tid=0x02efe800 nid=0x250 in Object.wait() [0x037cf000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:458) - locked (a org.apache.tomcat.util.net.JIoEndpoint$Worker) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:484) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "TP-Monitor" daemon prio=6 tid=0x02eed800 nid=0xd64 in Object.wait() [0x0375f000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable) at org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable.run(ThreadPool.java:565) - locked (a org.apache.tomcat.util.threads.ThreadPool$MonitorRunnable) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "TP-Processor4" daemon prio=6 tid=0x0318b000 nid=0x998 runnable [0x0370f000] java.lang.Thread.State: RUNNABLE at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390) - locked (a java.net.SocksSocketImpl) at java.net.ServerSocket.implAccept(ServerSocket.java:453) at java.net.ServerSocket.accept(ServerSocket.java:421) at org.apache.jk.common.ChannelSocket.accept(ChannelSocket.java:312) at org.apache.jk.common.ChannelSocket.acceptConnections(ChannelSocket.java:666) at org.apache.jk.common.ChannelSocket$SocketAcceptor.runIt(ChannelSocket.java:877) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "TP-Processor3" daemon prio=6 tid=0x0308f800 nid=0x92c in Object.wait() [0x036bf000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:662) - locked (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "TP-Processor2" daemon prio=6 tid=0x03192400 nid=0xfac in Object.wait() [0x0366f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:662) - locked (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "TP-Processor1" daemon prio=6 tid=0x03182400 nid=0x8d8 in Object.wait() [0x0361f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Object.wait(Object.java:485) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:662) - locked (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "http-8080-Acceptor-0" daemon prio=6 tid=0x03172400 nid=0xf04 runnable [0x035cf000] java.lang.Thread.State: RUNNABLE at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390) - locked (a java.net.SocksSocketImpl) at java.net.ServerSocket.implAccept(ServerSocket.java:453) at java.net.ServerSocket.accept(ServerSocket.java:421) at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61) at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:352) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "ContainerBackgroundProcessor[StandardEngine[Catalina]]" daemon prio=6 tid=0x03163400 nid=0xbe8 waiting on condition [0x0357f000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1579) at java.lang.Thread.run(Thread.java:662) Locked ownable synchronizers: - None "GC Daemon" daemon prio=2 tid=0x0307bc00 nid=0x110 in Object.wait() [0x0349f000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a sun.misc.GC$LatencyLock) at sun.misc.GC$Daemon.run(GC.java:100) - locked (a sun.misc.GC$LatencyLock) Locked ownable synchronizers: - None "Low Memory Detector" daemon prio=6 tid=0x02aecc00 nid=0x5b4 runnable [0x00000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "CompilerThread0" daemon prio=10 tid=0x02ae7000 nid=0x798 waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Attach Listener" daemon prio=10 tid=0x02ae5800 nid=0xddc waiting on condition [0x00000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Signal Dispatcher" daemon prio=10 tid=0x02ae4000 nid=0xc00 runnable [0x00000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "Finalizer" daemon prio=8 tid=0x02add400 nid=0x378 in Object.wait() [0x02caf000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118) - locked (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159) Locked ownable synchronizers: - None "Reference Handler" daemon prio=10 tid=0x02adbc00 nid=0x474 in Object.wait() [0x02c5f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on (a java.lang.ref.Reference$Lock) at java.lang.Object.wait(Object.java:485) at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116) - locked (a java.lang.ref.Reference$Lock) Locked ownable synchronizers: - None "main" prio=6 tid=0x002b7000 nid=0x14c runnable [0x0090f000] java.lang.Thread.State: RUNNABLE at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:390) - locked (a java.net.SocksSocketImpl) at java.net.ServerSocket.implAccept(ServerSocket.java:453) at java.net.ServerSocket.accept(ServerSocket.java:421) at org.apache.catalina.core.StandardServer.await(StandardServer.java:389) at org.apache.catalina.startup.Catalina.await(Catalina.java:662) at org.apache.catalina.startup.Catalina.start(Catalina.java:614) 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:289) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) Locked ownable synchronizers: - None "VM Thread" prio=10 tid=0x02ada400 nid=0x210 runnable "VM Periodic Task Thread" prio=10 tid=0x02aefc00 nid=0x79c waiting on condition JNI global references: 1529
嘗試進行線程轉儲以獲取服務器上運行的所有線程的列表。 由此,您可能可以根據堆棧跟蹤來精確指出哪個類啟動了線程
在控制台窗口上按ctrl + break
在命令行中輸入: kill -3 <pid>
看起來您正在運行JMX,給人的印象是Tomcat JMX服務器可能實際上是在設置計時器線程。 除了您在JavaRanch上的並行帖子中提到的內容之外,轉儲中還有一個java2D線程。
我無法告訴100%,因為我不知道哪些線程是孤立線程的父級。 如果您可以確定,那將會有所幫助。
但是,您的Affine Transform肯定會引入圖形。 這是一種圖形功能,它將嘗試將您的視頻卡用作硬件加速器。 如果您沒有指定無頭操作,它將進入您的窗口系統。
受此線程的啟發,我找到了以下解決方案:
您只需要將AWT-Window-Thread附加到System-Classloader,而不是Wabapp-Classloader。 您可以像這樣在ServletContextListener中進行操作:
public void contextInitialized(ServletContextEvent evt) {
Thread thread = Thread.currentThread();
ClassLoader ccl = thread.getContextClassLoader(); // PUSH
try {
thread.setContextClassLoader(ClassLoader.getSystemClassLoader());
Toolkit.getDefaultToolkit().createImage(new byte[]{});
} finally {
thread.setContextClassLoader(ccl); // POP
}
}
這與Windows(即MS Windows)和對底層OS的本地調用有關。 這些通常是GUI類型的窗口操作,但也可能是其他特定於OS的事物,例如與剪貼板或字體相關。
但是,如果沒有明顯的代碼可以引起您的觸發,那么我就不用擔心-該警告更多地是在沒有取消Web應用程序中新線程的一般情況下進行的。您應該明確地做一些事情,而不完全了解潛在問題。
我們有tomcat服務器和jsf。 JSF客戶端將向服務器請求圖像,並使AWT-Windows線程啟動。 由於線程contextClassLoader是WebappClassLoader,因此似乎導致內存泄漏。
看起來像調用Java2DResource可能導致創建AWT-Windows線程-
守護程序線程[http-8080-1](已暫停(在線程中輸入方法))
線程。(Runnable,字符串)行:444 <-線程名稱是AWT-Windows WToolkit。()行:244 NativeConstructorAccessorImpl.newInstance0(Constructor,Object [])行:不可用[本機方法]
NativeConstructorAccessorImpl.newInstance(Object [])行:39
DelegatingConstructorAccessorImpl.newInstance(Object [])行:27
Constructor.newInstance(Object ...)行:513 Class.newInstance0()行:355
Class.newInstance()行:308
Toolkit $ 2.run()行:846
AccessController.doPrivileged(PrivilegedAction)行:不可用[本機方法]
Toolkit.getDefaultToolkit()行:826
D3DGraphicsDevice。()行:47
SurfaceManagerFactory.createCachingManager(BufferedImage)行:48
SurfaceManager.getManager(Image)行:54
SurfaceData.getDestSurfaceData(Image)行:123 Win32GraphicsEnvironment(SunGraphicsEnvironment).createGraphics(BufferedImage)行:389
HeadlessGraphicsEnvironment.createGraphics(BufferedImage)行:76
BufferedImage.createGraphics()行:1137
TabStripeImage(Java2Dresource).getImage(ResourceContext)行:115
TabStripeImage(Java2Dresource).send(ResourceContext)行:89
ResourceLifecycle.sendResource(ResourceContext,InternetResource)行:219 ResourceLifecycle.send(ResourceContext,InternetResource)行:158 InternetResourceService.load(Object,Object)行:335
LRUMapCache.load(Object,Object)行:116
LRUMapCache.get(Object,Object)行:87
InternetResourceService.serviceResource(String,HttpServletRequest,HttpServletResponse)行:195
InternetResourceService.serviceResource(HttpServletRequest,HttpServletResponse)行:141
Filter(BaseFilter).doFilter(ServletRequest,ServletResponse,FilterChain)行:508 Ajax4jsfFilter.doFilter(ServletRequest,ServletResponse,FilterChain)行:56
SeamFilter $ FilterChainImpl.doFilter(ServletRequest,ServletResponse)行:69
LoggingFilter.doFilter(ServletRequest,ServletResponse,FilterChain)行:60
SeamFilter $ FilterChainImpl.doFilter(ServletRequest,ServletResponse)行:69
SeamFilter.doFilter(ServletRequest,ServletResponse,FilterChain)行:158 ApplicationFilterChain.internalDoFilter(ServletRequest,ServletResponse)行:235
ApplicationFilterChain.doFilter(ServletRequest,ServletResponse)行:206
StandardWrapperValve.invoke(Request,Response)行:233
StandardContextValve.invoke(Request,Response)行:191
StandardHostValve.invoke(Request,Response)行:127
ErrorReportValve.invoke(請求,響應)行:102
AccessLogValve.invoke(Request,Response)行:555
StandardEngineValve.invoke(Request,Response)行:109 CoyoteAdapter.service(Request,Response)行:298
Http11AprProcessor.process(long)行:861
Http11AprProtocol $ Http11ConnectionHandler.process(long)行:579
AprEndpoint $ Worker.run()行:1584 Thread.run()行:619 [本地變量不可用]
您是否正在運行包括Jasper,JFreechart,LiquidOffice,StyleReport等某些圖形庫,它們可能與AWT交互?
嘗試通過提供-Djava.awt.headless = true屬性來啟動tomcat,以查看它擺脫了異常
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.