Java NIO类库Selector机制解析(2)

三、  开始调查 : 怎么Java这么“傻”!

于是,C/C++的老鸟从SystemInternals上下载Process Explorer来查看一下究竟是什么个Loopback Connection。果然,打开java运行进程,发现有一些自己连接自己的localhost的TCP/IP链接。于是另一个问题又出现了,

“凭什么啊?为什么会有自己和自己的连接?我程序里没有自己连接自己啊,怎么可能会有这样的链接啊?而自己连接自己的端口号居然是些奇怪的端口。”

问题变得越来越蹊跷了。难道这都是Selector.open()在做怪?难道Selector.open()要创建一个自己连接自己的链接?写个程序看看:

import java.nio.channels.Selector;

import java.lang.RuntimeException;

import java.lang.Thread;

publicclass TestSelector {

privatestaticfinalint MAXSIZE=5;

publicstaticfinalvoid main( String argc[] ) {

Selector [] sels = new Selector[ MAXSIZE];

try{

for( int i = 0 ;i< MAXSIZE ;++i ) {

sels[i] = Selector.open();

//sels[i].close();

}

Thread.sleep(30000);

}catch( Exception ex ){

thrownew RuntimeException( ex );

}

}

}

这个程序什么也没有,就是做5次Selector.open(),然后休息30秒,以便我使用Process Explorer工具来查看进程。程序编译没有问题,运行起来,在Process Explorer中看到下面的对话框:(居然有10个连接,从连接端口我们可以知道,互相连接,如:第一个连第二个,第二个又连第一个)

不由得赞叹我们的Java啊,先不说这是不是一件愚蠢的事。至少可以肯定的是,Java在消耗宝贵的系统资源方面,已经可以赶的上某些蠕虫病毒了。

如果不信,不妨把上面程序中的那个MAXSIZE的值改成65535试试,不一会你就会发现你的程序有这样的错误了:(在我的XP机器上大约运行到2000个Selector.open() 左右)

Exception in thread "main" java.lang.RuntimeException: java.io.IOException: Unable to establish loopback connection

at Test.main(Test.java:18)

Caused by: java.io.IOException: Unable to establish loopback connection

at sun.nio.ch.PipeImpl$Initializer.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at sun.nio.ch.PipeImpl.<init>(Unknown Source)

at sun.nio.ch.SelectorProviderImpl.openPipe(Unknown Source)

at java.nio.channels.Pipe.open(Unknown Source)

at sun.nio.ch.WindowsSelectorImpl.<init>(Unknown Source)

at sun.nio.ch.WindowsSelectorProvider.openSelector(Unknown Source)

at java.nio.channels.Selector.open(Unknown Source)

at Test.main(Test.java:15)

Caused by: java.net.SocketException: No buffer space available (maximum connections reached?): connect

at sun.nio.ch.Net.connect(Native Method)

at sun.nio.ch.SocketChannelImpl.connect(Unknown Source)

at java.nio.channels.SocketChannel.open(Unknown Source)

... 9 more

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyzzwj.html