有没有办法重用java中的套接字来避免为新的TCP连接分配内存?

问题描述:

我想在java中构建一个简单的转发服务器,只分配最少量的内存,并且很少触及gc。我可以使用预先分配的缓冲区将数据复制到输出流和输入流中,但每个新连接似乎都分配了大约10k的内存。是否有一种简单的方法在连接关闭后重用Socket对象以避免这种情况(这是假设Sockets在内部重用时不需要分配额外的内存)?有没有办法重用java中的套接字来避免为新的TCP连接分配内存?

为了澄清,'套接字'我指的是java类,而不是套接字的通用概念。通过“重用”,我的意思是我想重用对象分配的内存,以避免通过垃圾回收来回收该内存。这样做的动机是创建一个简单,高度响应的服务器,不需要暂停垃圾收集(我知道我可以使用C/C++或专有的JVM,但我试图探索这种解决方案作为一种可能性) 。

+1

是的。它被称为连接池。 –

+0

当垃圾收集器不再被任何东西引用时,Java垃圾收集器不应该释放关闭的Sockets的内存吗?如果是这样,那么旧套接字占用的10K内存应该返回到空闲内存池,并且应该没有问题... –

+0

是的,但我想避免GC暂停。 – jonderry

不,一旦关闭,Java就不能在Java中重用Socket。

+0

Chris在关于连接池的评论中错了吗? – jonderry

+1

@jonderry是的。连接池是一种重用活动连接的技术。一旦连接关闭/断开/关闭,就不能再使用它的Socket对象来进行其他/新连接。 – nos

+0

套接字关闭后,不能在任何语言中重用套接字。 – EJP