sun.rmi.transport.tcp.TCPTransport uses 100% CPU



我正在开发一个基于NIO的非阻塞SocketChannels的通信库,这样我就可以使用select来降低线程的CPU使用率(并加快对其他事件的反应时间)。SocketChannel是在我的线程外部创建的,并添加到它处理的列表中,将它们标记为非阻塞,并将它们添加到Selector中进行READ操作(必要时进行WRITE操作,但这在我的问题中不会发生)。

我有一个用于测试的小型Swing应用程序,在本地运行,它可以是客户端也可以是服务器:客户端连接到服务器,它们可以相互发送消息。非常简单,工作良好,但CPU除外,一旦在客户端和服务器之间建立连接,CPU就会达到100%(每个jvm为50%)。

运行jvisualvm表明,sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()使用了98%的应用程序时间,只计算了3个方法调用
强制堆栈跟踪显示它正在阻止FilteredInputStreamSocket上的read操作。

我有点困惑,因为我不使用RMI(尽管我可以理解NIO和RMI可以共享"传输"代码部分)。我看到过一些类似的问题,但每个问题都是专门使用RMI的,我不是。我看到的答案是,当我在没有任何网络流量的情况下获得100%的CPU时,这个ConnectionHandler.run()方法负责编组/解编组。我只能推断套接字上的活动等待,但这听起来很奇怪,尤其是对于非阻塞SocketChannel。。。

任何想法都将不胜感激!

我跟踪了select(int timeout)的CPU使用情况,无论timeout的值如何,它都会立即返回0。我对这个函数的理解是,它会阻塞,直到弹出选定的操作,或者达到超时(如Javadoc中所述)。

然而,我发现另一篇StackOverflow帖子也显示了同样的问题:一旦接受连接,就必须取消OP_CONNECT操作。

非常感谢@Alexander和@EJP对OP_WRITE/OP_CONNECT相似性的澄清。

关于tge RMI部分,可能是由于Eclipse运行配置。

最新更新