一些现代网卡支持直接内存访问以提高性能。如何从 Java 中利用此功能?
JVM 是否自动提供此功能,还是我需要在用于与该 NIC 通信的 ByteBuffers 上执行 allocateDirect?
有没有人有讨论这个的文档?
一些现代网卡支持直接内存访问以提高性能。如何从 Java 中利用此功能?
JVM 是否自动提供此功能,还是我需要在用于与该 NIC 通信的 ByteBuffers 上执行 allocateDirect?
有没有人有讨论这个的文档?
使用网卡的 DMA 功能是操作系统的任务。JVM 并不真正关心操作系统是如何做到的,它只是使用操作系统的功能来与“网络接口”通信。
在典型的桌面/服务器 JVM 中,您无法从 Java 内部执行此操作,因为这是操作系统区域,需要您接触 C 代码。去看看 JNI 或 JNA 看看如何做到这一点。请注意,如果您没有完全正确地做到这一点,这可能会使您的应用程序变得脆弱。
是的 - ankon 的回答是正确的。Java 在沙箱中运行 - 一个虚拟机(因此在 JVM 中出现了“VM”;Sun 实际上构建了一个物理版本——它在某处展示)。
与 ActiveX 不同,Java 从未被设计为(有意地)延伸到沙箱之外,后者几乎可以在 PC 上的任何地方运行。
想想 ActiveX 多年来通过浏览器所做的所有坏事。您不希望 Java 发生这种情况,对吗?
虽然...
您可能能够在 Java 中实例化一个可以访问硬件的对象(例如,其中一个 ActiveX 控件或某些 DLL - 您也必须编写)。
我看到的问题是吞吐量。使用 100MB 或 1000MB 卡,JVM(请记住,这是在操作系统上运行的 VM,因此您从硬件中移除了几层)是否有速度处理负载下的内容?您是否想要一个 Java 程序在修改 NIC 时保留数据(想想对系统其余部分的影响)?
在这一点上,您最好用 C 来编写您的解决方案的辛勤工作。而且,如果您仍然需要 Java 来处理这些数据,请将其放在 Java 可以访问的地方。
如果您没有在 java 中获得所需的网络吞吐量,那么您将需要编写一个 C 包装器才能访问它。
您是否对代码进行了基准测试以找出性能问题的真正所在?如果您告诉我们,我们可能会在不诉诸 JNI 的情况下为您提供帮助。