线程处于RUNNABLE java.net.PlainDatagramSocketImpl.receive0
zytry 2012-03-31 04:53:05 java通过线程池管理特功能的线程(每个线程都有socket通信。)。但在某linux环境下,线程中的socket通讯貌似无法正常关闭;线程一直涨到5000以上知道系统outmemory,所有线程无法再创建。
通过jstack查看,大部分线程都处于以下状态:
"Reciever" daemon prio=10 tid=0x08a84400 nid=0x1193 runnable [0x56e24000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainDatagramSocketImpl.receive0(Native Method)
- locked <0x75cf63c0> (a java.net.PlainDatagramSocketImpl)
at java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
- locked <0x75cf63c0> (a java.net.PlainDatagramSocketImpl)
at java.net.DatagramSocket.receive(DatagramSocket.java:725)
- locked <0x75cf6400> (a java.net.DatagramPacket)
- locked <0x75cf0ff8> (a java.net.DatagramSocket)
at com.voxbiblia.jresolver.UDPTransportService.recv(UDPTransportService.java:71)
at com.voxbiblia.jresolver.ConversationService$Reciever.run(ConversationService.java:119)
Locked ownable synchronizers:
- None
因为线程的创建是通过quartz自动任务产生,所以同时发现同样数量的如下信息:
"Scheduler" daemon prio=10 tid=0x082c3800 nid=0x86d in Object.wait() [0x668c5000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at com.voxbiblia.jresolver.ConversationScheduler.run(ConversationScheduler.java:127)
- locked <0x759e7b28> (a com.voxbiblia.jresolver.ConversationScheduler)
Locked ownable synchronizers:
- None
代码中socket.close()是在finally中调用过的。
在大部分linux环境下都是没问题,任务线程不会超过线程池的上限!
只有这个某公司自开发的内核的linux。只要用到这个socket通信线程的功能部分就会最终线程涨满...直至进程无法再创建任何线程...
有没有兄弟遇到过此类型的问题。望能提供一点参考,望不吝赐教,我这里先行道谢!