爆炸

碰到个问题:

tomcat服务器关闭后就报错!大概意思是tomcat容器关闭后,rabbitmq的连接没有关闭,c3p0连接池管理的线程未关闭,会造成内存泄漏。如果线程开着一直关不掉那不就很消耗内存嘛!

服务器的内存使用都到97%了。但是linux的内存使用和Windows不一样。一旦有新的进程就给这个进程开一段新内存,即使该进程停止了,也会保留在这里,方便下一次能快速启动。

我不知道tomcat的start是不是另外开一个新进程,之前stop的进程依然在?

用ps -ef | grep java 可以查看所有CMD是java的进程。一打开发现有好多个,特别是昨天3月7号的。然后。。。就一条一条杀。。内存占用就降下来了。

rabbitmq可以监听servlet,servlet关闭时断开mq连接。但是那个c3p0的不知道怎么结束,很愁。

07-Mar-2019 10:37:25.161 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [obd] appears to have started a thread named [AMQP Connection 129.211.96.209:5672] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 java.net.SocketInputStream.socketRead0(Native Method)
 java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
 java.net.SocketInputStream.read(SocketInputStream.java:171)
 java.net.SocketInputStream.read(SocketInputStream.java:141)
 java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
 java.io.BufferedInputStream.read(BufferedInputStream.java:265)
 java.io.DataInputStream.readUnsignedByte(DataInputStream.java:288)
 com.rabbitmq.client.impl.Frame.readFrom(Frame.java:91)
 com.rabbitmq.client.impl.SocketFrameHandler.readFrame(SocketFrameHandler.java:164)
 com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:598)
 java.lang.Thread.run(Thread.java:748)
07-Mar-2019 10:37:25.162 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [obd] appears to have started a thread named [pool-1-thread-2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
 java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 java.lang.Thread.run(Thread.java:748)
07-Mar-2019 10:37:25.163 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [obd] appears to have started a thread named [pool-1-thread-3] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 java.lang.Thread.run(Thread.java:748)
07-Mar-2019 10:37:25.163 警告 [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [obd] appears to have started a thread named [pool-1-thread-4] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
 sun.misc.Unsafe.park(Native Method)
 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
 java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
 java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
 java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 java.lang.Thread.run(Thread.java:748)

这里摘一段别人的讲解,对我还挺有用的

Web应用的后台Java程序中用Timer().schedule()方法定时的开启线程并执行,关闭tomcat服务后,仍然按照前面设置的时间频率开启线程,并向tomcat的输出日志文件中输出

tomcat容器只是按照Java EE规范来管理应用中标准组件的生命周期,但自己创建出来的资源要记得自己负责处理,容器是不会替你管理的。JVM中,所有的非守护线程都停止了,JVM才能正常停止。

解决的方法:将自己创建的线程、timer、scheduler开启的线程设置为守护线程(deamon) 即声明线程后调用setDeamon(true),将该线程设置为守护线程,则容器关闭后,这些守护线程会立即关闭

或者自己能够管理线程的生命周期,可以在Servlet或ServletContextListener的init方法中初始化资源,在destroy方法中释放资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值