最新のネットワーク カードの中には、パフォーマンスを向上させるためにダイレクト メモリ アクセスをサポートするものがあります。Java からこの機能を利用するにはどうすればよいですか?
JVM はこれを自動的に提供しますか? それとも、その NIC と通信するために使用している ByteBuffers で allocateDirect を実行する必要がありますか?
これについて説明しているドキュメントを持っている人はいますか?
最新のネットワーク カードの中には、パフォーマンスを向上させるためにダイレクト メモリ アクセスをサポートするものがあります。Java からこの機能を利用するにはどうすればよいですか?
JVM はこれを自動的に提供しますか? それとも、その NIC と通信するために使用している ByteBuffers で allocateDirect を実行する必要がありますか?
これについて説明しているドキュメントを持っている人はいますか?
ネットワーク カードの DMA 機能を使用するのは、オペレーティング システムのタスクです。JVM は、OS がどのように動作するかをあまり気にせず、「ネットワーク インターフェイス」と通信するためにオペレーティング システムの機能を使用するだけです。
一般的なデスクトップ/サーバー JVM の Java 内からこれを行うことはできません。これは、C コードにアクセスする必要があるオペレーティング システム領域であるためです。これを行う方法については、JNI または JNA を参照してください。これを正確に行わないと、アプリケーションが脆弱になる可能性があることに注意してください。
ええ-アンコンの答えは正しいです。Javaはサンドボックス(仮想マシン)で動作します(したがって、JVMの「VM」。Sunは実際に1つの物理バージョンを構築しました。どこかに表示されています)。
Javaは、PC上のほぼどこにでも移動できるActiveXとは異なり、サンドボックスの外側に到達するように(意図的に)設計されたことはありません。
ActiveXがブラウザを介して何年にもわたって行ってきたすべての悪いことを考えてみてください。あなたはそれがJavaで起こることを望まないでしょう?
それでも...
ハードウェアにアクセスできるJavaでオブジェクトをインスタンス化できる場合があります(たとえば、これらのActiveXコントロールの1つ、またはDLLなど、作成する必要があります)。
問題はスループットです。100MB または 1000MB のカードでは、JVM (これは OS 上で実行されている VM であるため、ハードウェアから削除された 2 つのレイヤーであることを思い出してください) は、負荷がかかった状態で入ってくるものを処理する速度を備えていますか? NIC をいじっている間、Java プログラムが NIC にデータを保持することを望みますか (システムの残りの部分への影響を考えてください)。
この時点で、ソリューションの骨の折れる部分を C で記述した方がよいでしょう。また、そのデータを処理するために Java が必要な場合は、Java がアクセスできる場所に配置してください。
Java で必要なネットワーク スループットが得られない場合は、それにアクセスするために C ラッパーを作成する必要があります。
コードのベンチマークを実行して、パフォーマンスの問題が実際にどこにあるのかを見つけましたか? JNI に頼らなくても解決できる可能性が高いことをお知らせいただければ、