当前位置: 首页 > 知识库问答 >
问题:

tomcat7 servlet中的内存泄漏

东方乐
2023-03-14

我有一个在Tomcat7上运行的web应用程序的问题。

当我尝试重新启动web应用程序时,我在servlet内部创建的线程打开的端口仍然是打开的。

“http-bio-8080-acceptor-0”后台进程prio=10 tid=0x00007F4ED4206000 nid=0x71f0 runnable[0x00007F4ECC78F000]java.lang.thread.state:runnable at java.net.plainsockeTimpl.socketAccept(本机方法)at java.net.abstractplainsockeTimpl.java:398)at java.net.serversocket.implace(serversocket.java:530)at java.net.serversocket.accept(serversocket.java:498)at org.apache.tomcat.util.net.defaull tServerSocketFactory.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]]”后台进程prio=10 tid=0x00007F4ED4205800 nid=0x71EF等待条件[0x00007F4ECC890000]java.lang.thread.state:TIMED_WAITING(睡眠)at java.lang.thread.sleep(本机方法)at org.apache.catalina.core.containerbase$ContainerBackgroundProcessor.run(containerbase.java:1508)at java.lang.thread.run(thread.java:745)

“Thread-4”后台进程prio=10 tid=0x00007F4EA00F6800 nid=0x71EE runnable[0x00007F4ECC991000]java.lang.thread.state:在java.net.abstractPlainSockeTimpl.SocketAccept(本机方法)在java.net.abstractPlainSockeTimpl.java:398)在java.net.ServerSocket.ImplAccept(ServerSocket.java:530)在java.net.ServerSocket.Accept(ServerSocket.java:498)在testProject.Server.Device.AcceptConnectionDaemon.Run(AcceptConnectionDA emon.java:39)在java.lang.Thread.Run(Thread.java:745)

“com.google.inject.internal.util.$finalizer”后台进程prio=10 tid=0x00007F4EA074D000 nid=0x71ed in object.wait()[0x00007F4ECCA92000]java.lang.thread.state:等待(在对象监视器上)在java.lang.object.wait(本机方法)-等待<0x00000007EA2A9A18>(a java.lang.Ref.Referencequeue$lock)在java.lang.Ref.Referencequee.remove(referencequee.135)-锁定<0x00000007EA2A9A18>(a java.lang.Ref.Referencequee.$lock)lock)在java.lang.ref.referencequee.remove(referencequee.java:151)在com.google.inject.internal.util.$finalizer.run(finalizer.java:114)

“Thread-3”后台进程prio=10 tid=0x00007F4EA1A71800 nid=0x71EC runnable[0x00007F4ECCB93000]java.lang.thread.state:在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:等待(停车)在sun.misc.unsafe.park(本机方法)-停车等待<0x0000000785ed5558>(a java.util.concurrent.locks.abstractQueuedSynchronizer$conditionObject)在java.util.concurrent.locks.abstractQueuedSynchronizer$conditionObject)在java.util.concurrent.locks.abstractQueuedSynchronizer$conditionObject.java.186)在43)在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>(a java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject)在java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject)在java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject.java.186)在)在java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)在java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)在java.util.concurrent.ThreadPoolExecutor.runworker(ThreadPoolExecutor.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>(a java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject)在java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject)在java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject.java.186)在43)在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:等待(停车)在sun.misc.unsafe.park(本机方法)-停车等待<0x0000000785ed5558>(a java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject)在java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject)在java.util.concurrent.Locks.AbstractQueuedSynchronizer$ConditionObject.java.186)在)在java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)在java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)在java.util.concurrent.ThreadPoolExecutor.runworker(ThreadPoolExecutor.1130)在java.util.concurrent.ThreadPoolExecutor$worker.run(ThreadPoolExecutor.java:615)在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(本机方法)-停车等待<0x0000000785ed5558>(a java.util.concurrent.locks.abstractQueuedSynchronizer$conditionObject)在java.util.concurrent.locks.abstractQueuedSynchronizer$conditionObject)在java.util.concurrent.locks.abstractQueuedSynchronizer$conditionObject.java.186)在)在java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)在java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)在java.util.concurrent.ThreadPoolExecutor.runworker(ThreadPoolExecutor.1130)在java.util.concurrent.ThreadPoolExecutor$worker.run(ThreadPoolExecutor.java:615)在java.lang.Thread.run(Thread.java:745)

“Service Thread”后台进程prio=10 tid=0x00007F4ED40A7000 nid=0x71E1 runnable[0x0000000000000000000000]java.lang.Thread.State:runnable

“C2 CompilerThread1”后台进程prio=10 tid=0x00007F4ED40A4800 nid=0x71E0正在等待条件[0x0000000000000000000000]java.lang.Thread.State:可运行

“C2 CompilerThread0”后台进程prio=10 tid=0x00007F4ED40A2000 nid=0x71df正在等待条件[0x00000000000000000000]java.lang.Thread.State:可运行

“JDWP Event Helper Thread”后台进程prio=10 tid=0x00007F4ED409F800 NID=0x71DE runnable[0x000000000000000000]java.lang.Thread.State:runnable

“JDWP传输侦听器:DT_Socket”后台进程prio=10 tid=0x00007F4ED409C000 nid=0x71dd runnable[0x00000000000000000000]
java.lang.thread.state:runnable

“Signal Dispatcher”后台进程prio=10 tid=0x00007F4ED408F000 nid=0x71DC正在等待条件[0x0000000000000000000000]java.lang.Thread.State:可运行

“finalizer”后台进程prio=10 tid=0x00007F4ED406E800 nid=0x71db in object.wait()[0x00007F4ECE6B5000]java.lang.thread.state:等待(在对象监视器上)在java.lang.object.wait(本机方法)-等待<0x0000000784CCD218>(a java.lang.ref.referencequeue$lock)在java.lang.ref.referencequee.remove(referencequee.135)-锁定<0x0000000784CCD218>(a java.lang.ref.referencequee.$lock)在java.lang.ref.referenceque.remove(reference)equeue.java:151)在java.lang.ref.finalizer$finalizerthread.run(finalizer.java:209)

“Reference Handler”后台进程prio=10 tid=0x00007F4ED406C800 nid=0x71da in object.wait()[0x00007F4ECE7B6000]java.lang.thread.state:等待(在对象监视器上)在java.lang.object.wait(本机方法)-等待<0x0000000784CCCD80>(a java.lang.ref.reference$lock)在java.lang.object.wait(object.java:503)在java.lang.ref.reference$referenceHandler.run(reference.java:133)-锁定<0x0000000784CCCD80>(a java.lang.ref.reference$lock)

“VM线程”Prio=10 TID=0x00007F4ED4068800 NID=0x71D9可运行

如果有任何帮助,我将不胜感激。

共有1个答案

燕志学
2023-03-14

尝试在daemon类的主循环中检查Thread.IsInterrupted()。如果它是真的,就中断循环,它应该允许Tomcat成功关闭线程。

 类似资料:
  • 我尝试用一个大表(大约一万条记录)中的记录填充JdbcRowSet。我尝试了两个变体(参见下面的代码): 创建连接对象,使用JdbcRowSetImpl(connection)实例化,在循环中执行查询。 使用JdbcRowSetImpl(DriverManager.GetConnection(“jdbc:....”)实例化,在循环中执行查询。 第一个变体会导致内存泄漏,直到堆满为止。第二个变体没有

  • 我在Tomcat中得到了threadlocal内存泄漏错误,我正在使用ThreadPool,但在我的WebApp中没有threadlocal的实现。 严重:web应用程序[/mywebapp]创建了一个ThreadLocal,其键类型为[org.a pache.http.impl.cookie.dateformatholder$1](值为[org.apache.http.imp l.cookie.

  • 本文向大家介绍浅析Java中的内存泄漏,包括了浅析Java中的内存泄漏的使用技巧和注意事项,需要的朋友参考一下 ava最明显的一个优势就是它的内存管理机制。你只需简单创建对象,java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单,因为在Java应用中经常发生内存泄漏。 本教程演示了什么是内存泄漏,为什么会发生内存泄漏以及如何预防内存泄漏。 什么是内存泄漏? 定义:如果对象在应用中

  • 当关闭Tomcat时,我得到以下错误: 严重:web应用程序[App]创建了一个ThreadLocal,其键类型为[org.apache.logging.log4j.core.layout.PatternLayout$1](值为[org.apache.logging.log4j.core.layout.PatternLayout$1@14391AAF]),值类型为[java.lang.String

  • 我写了一段代码,让字母在我写的时候出现并飞行。这个问题消耗了大量的内存。 我已经优化了一点 在侦听器中共享对象并更新其参数。 每次打印新字母时调用 gc 但是它仍然使用大量的内存,所以有什么想法来降低它的内存利用率吗? 提前致谢。 操作系统:Arch Linux 64位平台:英特尔i7-第三代,8 GB内存IDE : Intellij JDK : 1.8.0_102

  • 问题内容: 我认为我的android应用正在泄漏内存。我不是绝对确定这是问题所在。 应用程序打开时经常崩溃,并且logcat尝试加载位图图像时会显示“内存不足”异常。 崩溃后,我重新打开了该应用程序,它运行正常。Logcat会显示许多“ gc”,并且JIT表会不时地向上调整大小,而不会向下调整,直到应用程序因内存不足错误而崩溃。 这听起来像是内存泄漏吗?如果是这样,我该如何定位和关闭泄漏点。 这是