我正在开发一些使用大量数据报套接字的代码。如果不仔细编码,这个数字可能会超过jvm允许的最大值。使用-Dsun.net.maxDatagramSockets=x
并不总是一种选择。我有这样的代码:
/* opening this channel will bring us to the limit--the maximum allowed by the JVM */
DatagramChannel channel1 = DatagramChannel.open();
/* do some stuff with channel1 */
/* Close channel1, and dereference it */
channel1.close();
channel1 = null;
/* this throws SocketException */
DatagramChannel channel2 = DatagramChannel.open();
分享DatagramChannel
s(即使用receive()
)可能是另一种选择,但了解这里发生的事情会很有用。
DatagramChannel
的最大数量之后,只有在另一个关闭时才会创建一个新的SocketChannel
。但是,我正在处理DatagramChannel
和close()
s的混合,问题是,即使我在通道上调用DatagramChannel
,就像我对它们一样,我有在创建另一个频道之前,确保我刚关闭的频道是SocketChannel
(而不是:checked
)。只是一个疏忽。