問題タブ [nio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
186 参照

java - ボンネットの下でGrizzlyを透過的に使用しますか?

グリズリーダイナミック/トランスペアレントをJavaアプリケーションにバインドする方法はありますか(おそらくスプリングを使用して)?または、IO処理はWebコンテナ(Glassfishな​​ど)の一部ですか?

0 投票する
6 に答える
10416 参照

java - SocketChannel.write() での Java NIO スレッドの問題

SocketChannel.write() を介して大量のデータを送信しているときに、基礎となる TCP バッファーがいっぱいになることがあります。データがすべて送信されるまで、write() を継続的に再試行する必要があります。

だから、私はこのようなものを持っているかもしれません:

問題は、大規模な ByteBuffer と基礎となる TCP バッファのオーバーフローが時折発生する問題であり、send() へのこの呼び出しが予期しない時間にわたってブロックされることを意味します。私のプロジェクトでは、何百ものクライアントが同時に接続されており、1 つのソケット接続によって引き起こされる 1 つの遅延により、1 つの SocketChannel によるこの 1 つの遅延が解決されるまで、システム全体がクロール状態になる可能性があります。遅延が発生すると、プロジェクトの他の領域で速度が低下するという連鎖反応が発生する可能性があり、遅延が少ないことが重要です。

この TCP バッファ オーバーフローの問題を透過的に処理し、SocketChannel.write() への複数の呼び出しが必要な場合にすべてをブロックすることのないソリューションが必要です。send() を Thread を拡張する別のクラスに配置して、独自のスレッドとして実行し、呼び出し元のコードをブロックしないようにすることを検討しました。ただし、維持している各ソケット接続のスレッドを作成する際に必要なオーバーヘッドが心配です。特に、99% の確率で SocketChannel.write() が最初の試行で成功する場合、スレッドが存在する必要がないことを意味します。 . (つまり、send() を別のスレッドに配置する必要があるのは、while() ループが使用されている場合のみです。バッファの問題が発生した場合のみ、おそらく 1% の時間です) バッファの問題がある場合1%の確率で、私はそうしません

それが理にかなっていることを願っています...いくつかの提案を実際に使用できます。ありがとう!

0 投票する
2 に答える
28738 参照

java - Java 1.6のFileChannel.mapからClosedByInterruptExceptionが発生するのはなぜですか?

私たちの顧客は、散発的に、私たちの呼び出しが。でFileChannel.map失敗することを訴えClosedByInterruptExceptionます。Javadocは、これを正当な可能性としてリストしていません。ここで何が起こっているのか誰か知っていますか?

0 投票する
1 に答える
265 参照

java - Thread.interrupt で動作するコードの反復可能な単体テストを作成する方法は?

たとえば、次のように呼び出すコードを考えてみましょう。

ClosedByInterruptException 状況を処理したいと考えています。現実的で再現可能な単体テストを作成する方法に困惑しています。

テストを行うには、何らかの方法でこのスレッドを他のスレッドと同期させ、他のスレッドが適切なタイミングで Thread#interrupt を呼び出すようにする必要があります。ただし、待機するためのすべてのプリミティブは、まあ、割り込み可能であり、割り込みをクリアします。

今のところ、テスト中のコードで Thread.currentThread().interrupt を取得しています (単体テストで要求されているように) が、これは実際の非同期割り込みとまったく同じではありませんね。

0 投票する
2 に答える
1866 参照

java - Java NIO: OP_ACCEPT と OP_READ の関係?

プロジェクトのコア NIO サーバー ネットワーク コードを書き直しています。また、将来の使用のために接続情報をいつ「保存」する必要があるかを把握しようとしています。たとえば、クライアントが通常の方法で接続すると、その接続されたクライアントの SocketChannel オブジェクトを保存して関連付け、いつでもそのクライアントにデータを書き込めるようにします。通常、クライアントの IP アドレス (ポートを含む) を、SocketChannel オブジェクトにマップする HashMap のキーとして使用します。そうすれば、IP アドレスを簡単に検索して、その SocketChannel を介してデータを非同期に送信できます。

これは最善の方法ではないかもしれませんが、うまくいきます。プロジェクトが大きすぎて、基本的なネットワーク コードを変更することはできませんが、提案を検討します。ただし、私の主な質問は次のとおりです。

将来の使用のために、どの時点で SocketChannel を「保存」する必要がありますか? 接続が (OP_ACCEPT を介して) 受け入れられると、SocketChannel への参照を保存しています。OP_READ イベントが発生したときにマップ エントリが既に存在していると想定できるため、これは効率的なアプローチだと思います。そうしないと、OP_READ が発生するたびに計算コストの高い HashMap のチェックを行う必要があり、それは明らかです。 OP_ACCEPT よりも多くのクライアントが発生します。私の懸念は、受け入れられる (OP_ACCEPT) がデータをまったく送信しない (OP_READ) 接続が存在する可能性があることです。これは、ファイアウォールの問題、またはクライアントまたはネットワーク アダプターの誤動作が原因である可能性があります。これにより、アクティブではなく、近いメッセージを受信しない「ゾンビ」接続が発生する可能性があると思います。

ネットワーク コードを書き直す理由の 1 つは、まれにクライアント接続が異常な状態になることがあるからです。接続が「有効」であり、保存できると仮定するために使用する情報を含め、OP_ACCEPT と OP_READ を処理した方法が間違っている可能性があると考えています。

申し訳ありませんが、私の質問は具体的ではありません。SocketChannel が本当に有効であるかどうかを判断するための最良かつ最も効率的な方法を探しているだけなので、それへの参照を保存できます。助けてくれてどうもありがとう!

0 投票する
3 に答える
936 参照

java - ネットワーク接続のテスト/トラブルシューティング ツール?

プロジェクトのサーバー側にノンブロッキング IO システムを作成しています。実際の実装は重要ではありません (気にするなら Java NIO です) が、ソケット通信をプログラミングする際に細心の注意を払わなければならない微妙な問題に非常に戸惑っています。私の知識は多くの分野で不足しているため、物事が「うまくいかない」可能性があるすべての方法を想像することさえできません...「半分閉じた」接続、予想よりもはるかに多くのデータを送信する接続など.

私が探しているのは、特定の動作の接続とテストのプロセスを自動化することにより、システムの堅牢性をテストするのに役立つある種のクライアント側ツールです。接続を開いたり、使用したり、閉じたりするさまざまな方法をシミュレートするための、さまざまな種類のオプションを備えたある種のツール。おそらく、一度に数メガバイトの意味不明なメッセージを送信したり、「意味をなさない」ことを試みたりすることができます。これらはすべて、コードが壊れる可能性のあるランダムでまれなことをテストできるようにするためです。 「壊れた」接続を認識せずに閉じます。

ツールのようなものはありますか?別のアプローチとして、Java コード/単体テストが考えられます。何かご意見は?本当にありがとう!

0 投票する
3 に答える
5228 参照

java - Java: 接続ごとのスレッド ブロッキング IO と NIO の完全なコード例?

わかりました、私はここで夢中になります。私は自分のサーバーの NIO コードを書き直しており、実際に頭の痛い問題に直面しています。要するに、NIO を「正しく」取得するのは非常に難しいということです。http://rox-xmlrpc.sourceforge.net/niotut/にある Rox のチュートリアルを教えてくれる人もいました。、これは良い方向に進んでいるように見えますが、私が望むほど完全ではありません。たとえば、キュ​​ーに入れられた発信 ByteBuffers が送信された後にのみ、サーバー側で接続を閉じる方法を知る必要があります。SocketChannel.close() は突然であり、時期尚早に実行するとデータが失われる可能性があります。また、読み取り ByteBuffer よりも大きい大きなパケットを送信する必要があります。Rox コード (および私が調べた他のコード) は、これを扱っています。キャッチされていない例外が適切に処理されていないように見える場所もたくさんあります。私のテストではいくつかのエラーがあり、NIO の複雑さを考えると、それらを適切に処理する方法が明確ではありません。

いずれにせよ、これらの問題を解決しようとすると、より複雑な微妙な点が現れ、非常に複雑になっています。そこで、まったく別のアプローチを検討しています。多くの人が、NIO は非常にエラーが発生しやすく、不必要に混乱し、複雑であると言っています。彼らは、各ソケット接続が独自のスレッドで実行されるブロッキング IO を使用する「接続ごとのスレッド」モデルの使用を提唱しています。これは良いアイデアのように思えます。(NIO のように) すべての接続に対して 1 つのセレクター スレッドを使用することで、(スレッドの) オーバーヘッドが高くなりますが、フロント エンドのボトルネックが軽減されます。この感情は、http://paultyma.blogspot.com/2008/03/writing-java-multithreaded-servers.htmlhttp://mailinator.blogspot.com/2008/02/kill-myth-などの投稿にも反映されています。 please-nio-is-not-faster-than.html

コードは NIO に比べて単純なはずですが、いくつかのサンプル コードを見てみたいと思います。何も見つからないようです。問題は、この「接続ごとのスレッドが I/O をブロックする」戦略に、実際に良い Google 検索結果を得ることができるより良い名前があるとは思わないことです。この「古い」I/O方法を使用してスレッドプールを使用してスケールアップする方法を説明するために、チュートリアルまたは簡単な例にリンクしてもらえますか? または、他の知恵の言葉はありますか?どうもありがとう!

0 投票する
1 に答える
9823 参照

java - ByteBuffer.allocateDirect() と MappedByteBuffer.load() の違い

を使用して特定のファイルをメモリマッピングすることにより、2 つ以上の JVM 間で一種の共有キャッシュを実装しようとしていましたMappedByteBufferMappedByteBuffer.load()仕様から、使用時にデータを直接バッファにロードする必要があることがわかります。これについていくつか質問があります。

私のコードスニペット::

  1. 上記のコードの出力は、直接メモリ使用量が 0 バイトです (File.txt は 1 GB)。しかし、行のコメントを外すと..

    Direct Memory Usage は 100MB です。そもそもなぜ直接メモリを使用していないのか(つまり、行がコメントアウトされているとき)、なぜそうなのか理解できません

  2. 上記のコードの直接メモリ使用量は 0 B ですが、プロセスの常駐メモリ ( unix top を使用) が 1 GB 増加していることがわかります。しかし、ボックスで「free -m」を実行しても、メモリ使用量の増加は見られません。

どちらの場合も、メモリがどこに行き着くのかについて少し混乱しています。

ありがとう!

0 投票する
1 に答える
2394 参照

java - NIOダイレクトバッファはいつどのように解放されますか?

スクラッチスペース用の一時バッファが必要なCライブラリがあります。ダイレクトバイトバッファのアドレスを渡すことを考えています。

  • VMは、最終的に解放される前にバッファーを再配置することを許可されていますか?JNIフレームがなくなると、ネイティブライブラリはポインタを保持します。私の理解では、VMがGC中にそれらを再配置する可能性があるため、JNIローカルオブジェクト参照をキャッシュすることはできません。これはバッファアドレスに適用されますか?

  • Javaでバッファを割り当ててから、バッファオブジェクトをスコープ外にすると、VMがバッファメモリを解放することを理解しています。NewDirectByteBufferを使用してネイティブコードで新しいバッファを作成する場合、バッキングメモリを解放するのは誰の責任ですか?

  • NewDirectByteBufferと、直接バッファーですでに使用されているアドレスを使用して、ネイティブコードで新しいバッファーを作成するとどうなりますか?メモリは二重に解放されますか?VM参照はメモリブロックをカウントし、それを参照する最後のバッファがガベージコレクションされたときにそれを解放しようとしますか?