首页 文章

Tomcat webapp错误 - 应用程序启动线程[AWT-Windows]但未能阻止它 - 内存泄漏?

提问于
浏览
2

直到今天我在电脑上进行本地测试时才注意到,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.

什么?我以前从未见过这个 . 所以我昨天检查了我的日志文件,果然,这个错误也存在 . 我不太明白是什么导致了这一点 .

Can I assume that it would have to be one of my servlets that uses objects from the java.awt package? 如果是这样,我如何查明导致此问题的代码?


已编辑添加线程转储

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

6 回答

  • 1

    尝试进行线程转储以获取服务器上运行的所有线程的列表 . 从这里,您可以根据堆栈跟踪确切地确定哪个类启动了线程

    Windows

    在控制台窗口按 ctrl + break

    Unix

    在命令行中输入: kill -3 <pid>

  • 1

    这与Windows(即MS Windows)和底层操作系统的本机调用有关 . 这些通常是GUI类型的窗口操作,但也可以是其他特定于操作系统的东西,例如剪贴板或字体相关 .

    如果你的代码中没有任何明显的东西可以看出它可能与它被触发的原因有什么关系,那么我就不用担心了 - 对于在web-app中关闭新线程的一般情况,这个警告更多在没有充分了解潜在问题的情况下,你应该明确做些什么 .

  • 3

    我们有tomcat服务器和jsf . JSF客户端将从服务器请求图像并导致AWT-Windows线程开始 . 由于线程contextClassLoader是WebappClassLoader,因此似乎会导致内存泄漏 .

    看起来调用Java2DResource会导致创建AWT-Windows线程 -

    守护程序线程[http-8080-1](暂停(进入线程中的方法))
    Thread . (Runnable,String)行:444 < - thread name是AWT-Windows WToolkit . ()行:244 NativeConstructorAccessorImpl.newInstance0(Constructor,Object [])行:不可用[native method]
    NativeConstructorAccessorImpl.newInstance(Object [])行:39
    DelegatingConstructorAccessorImpl.newInstance(Object [])行:27
    Constructor.newInstance(Object ...)行:513 Class.newInstance0()行:355
    Class.newInstance()行:308
    工具包$ 2.run()行:846
    AccessController.doPrivileged(PrivilegedAction)行:不可用[native method]
    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(请求,响应)行:233
    StandardContextValve.invoke(Request,Response)行:191
    StandardHostValve.invoke(请求,响应)行:127
    ErrorReportValve.invoke(请求,响应)行:102
    AccessLogValve.invoke(请求,响应)行:555
    StandardEngineValve.invoke(请求,响应)行:109 CoyoteAdapter.service(Request,Response)行:298
    Http11AprProcessor.process(long)行:861
    Http11AprProtocol $ Http11ConnectionHandler.process(long)行:579
    AprEndpoint $ Worker.run()行:1584 Thread.run()行:619 [局部变量不可用]

  • 1

    看起来你正在运行JMX,我得到的印象是Tomcat JMX服务器可能正在实际设置定时器线程 . 除了你在JavaRanch上的并行帖子中提到的那些,你在这里的转储中有一个java2D线程 .

    我不能告诉100%,因为我不知道哪些线程是孤儿线程的父母 . 如果你能确定,那会有所帮助 .

    然而,你的仿射变换肯定会拉动图形 . 这是一个图形功能,将尝试将您的视频卡用作硬件加速器 . 如果您没有指定无头操作,它将进入您的窗口系统来执行此操作 .

  • 0

    灵感来自this thread我找到了以下解决方案:

    您只需要将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
        }
    }
    
  • 1

    您是否正在运行包括某些图形库,如Jasper,JFreechart,LiquidOffice,StyleReport,......可能与AWT交互?

    尝试通过提供-Djava.awt.headless = true属性来启动tomcat,以查看是否删除了异常

相关问题