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
...
どんなアイデアでも大歓迎です!
このコードはRMIでのみ使用されます。あなたはRMIサービスをどこかに持っています。例えばレジストリ? – EJP
いいえ、それは似ていません。それはすべて純粋なNIOコードです。 私は使用している 'select(int timeout)'までCPU使用量を追跡することができました。タイムアウトが何であってもすぐに '0'を返します!私は今後の編集でそのポイントを開発します。 – Matthieu