在java中直接访问网卡

时间:2009-10-28 18:06:39

标签: java performance dma

一些现代网卡支持直接内存访问以提高性能。我如何利用Java中的这个功能?

JVM是否自动提供此功能,还是需要在我用来与该NIC通信的ByteBuffers上执行allocateDirect?

有没有人有讨论这个的文档?

5 个答案:

答案 0 :(得分:2)

使用网卡的DMA功能是操作系统任务。 JVM并不关心操作系统是如何做到的,只是简单地使用操作系统的功能来与“网络接口”进行通信。

答案 1 :(得分:1)

在典型的桌面/服务器JVM中,您无法从Java内部执行此操作,因为这是需要您使用C代码的操作系统区域。去看看JNI或JNA,看看如何做到这一点。请注意,如果您没有完全正确,这可能会使您的申请变得脆弱。

答案 2 :(得分:0)

是的 - ankon的回答是正确的。 Java在沙箱中运行 - 一个虚拟机(因此,JVM中的“VM”; Sun实际上构建了一个物理版本 - 它在某处显示)。
从未设计过Java(故意)到达沙箱之外,与ActiveX不同,ActiveX可以在PC上的任何地方使用。

想想ActiveX多年来通过浏览器所做的所有不好的事情。你不希望Java发生这种情况,是吗?

答案 3 :(得分:0)

...虽然

可能能够在Java中实例化一个有权访问硬件的对象(例如那些ActiveX控件之一,或者某些DLL,例如 - 你必须写的,太)。

我看到的问题是吞吐量。使用100MB或1000MB卡,JVM(请记住,这是在操作系统上运行的VM,因此您从硬件中移除了几层)是否有速度处理负载下的内容?你想要一个Java程序在你的网卡中修改数据吗(想想对系统其他部分的影响)吗?

此时,您可能最好用C语言编写解决方案的辛勤工作。而且,如果您仍然需要Java来使用该数据,请将其放在Java可以访问它的位置。

答案 4 :(得分:0)

如果您没有获得java中所需的网络吞吐量,那么您将需要编写C包装器才能访问它。

您是否对代码进行了基准测试,以找出性能问题的确切位置?如果您告诉我们,我们可以在不诉诸JNI的情况下帮助您。