2012-02-15 10 views
2

NIOの非ブロックSocketChannelsに基づいて通信ライブラリを開発していますので、selectを使用してCPU使用率を低く抑え、他のイベント)。 SocketChannelはスレッドの外部に作成され、処理するリストに追加され、ノンブロッキングとマークされ、READ操作の場合はSelectorに追加されます(必要に応じてWRITEされますが、問題は発生しません)。sun.rmi.transport.tcp.TCPTransportは100%CPUを使用します

ローカルで実行されているテスト用の小さなSwingアプリケーションがあります。これはクライアントまたはサーバーのいずれかです。クライアント1がサーバー1に接続し、相互にメッセージを送信できます。クライアントとサーバーの間の接続が確立されるとすぐに100%(各jvmごとに50%)のCPUを除いて、シンプルでうまく動作します。

jvisualvmを実行すると、sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run()はアプリケーション時間の98%を使用し、3回のメソッド呼び出ししかカウントしません。
強制スタックトレースは、のFilteredInputStreamにあるread操作でブロックしていることを示しています。

私はRMIを使用しないので少し困惑します(NIOとRMIが "トランスポート"コード部分を共有できることは理解できますが)。私はいくつかの同様の質問を見てきましたが、それぞれが具体的にRMIを使用していました。私が見た答えは、このConnectionHandler.run()メソッドはマーシャル/アンマーシャリングの処理を担当しています。ここでは、ネットワークトラフィックがなくても100%のCPUが得られます。私はソケットでアクティブな待ち時間しか推測できませんが、特にノンブロッキングの場合は、奇妙に聞こえますSocketChannel ...

どんなアイデアでも大歓迎です!

+0

このコードはRMIでのみ使用されます。あなたはRMIサービスをどこかに持っています。例えばレジストリ? – EJP

+0

いいえ、それは似ていません。それはすべて純粋なNIOコードです。 私は使用している 'select(int timeout)'までCPU使用量を追跡することができました。タイムアウトが何であってもすぐに '0'を返します!私は今後の編集でそのポイントを開発します。 – Matthieu

答えて

2

私はselect(int timeout)までCPU使用量を追跡し、timeoutの値にかかわらずすぐに0を返します。この関数の理解は、選択された操作がポップアップするか、タイムアウトに達するまでブロックされます(Javadocのように)。見つけた場合

しかし、同じ問題だったthis other StackOverflow postOP_CONNECT操作は、接続が許可されるとをキャンセルする必要があります。

OP_WRITE/OP_CONNECTの類似点を明確にするため、@Alexanderと@EJPに感謝します。

関連する問題