Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI调用的缺点?_Java_Java Native Interface_Mmap_Bytebuffer - Fatal编程技术网

Java JNI调用的缺点?

Java JNI调用的缺点?,java,java-native-interface,mmap,bytebuffer,Java,Java Native Interface,Mmap,Bytebuffer,我在这里读这篇文章: 在该页上,有以下部分: 事实上,我所看到的在纯Java程序中使用直接缓冲区的唯一原因是它们在垃圾收集期间不会被移动。如果您读过我关于引用对象的文章,您会记得垃圾收集器在处理死对象后会压缩堆。如果有大块堆内存被分配为缓冲区,那么它们可能会作为压缩的一部分被移动,无论CPU的速度有多快,这都需要时间;这不是你想在每一个完整的收藏中都做的事情。因为直接缓冲区位于堆之外,所以它不受集合的影响另一方面,每个数据访问都是一个JNI调用。只有基准测试才能告诉您这对您的特定应用程序有帮助还

我在这里读这篇文章:

在该页上,有以下部分:

事实上,我所看到的在纯Java程序中使用直接缓冲区的唯一原因是它们在垃圾收集期间不会被移动。如果您读过我关于引用对象的文章,您会记得垃圾收集器在处理死对象后会压缩堆。如果有大块堆内存被分配为缓冲区,那么它们可能会作为压缩的一部分被移动,无论CPU的速度有多快,这都需要时间;这不是你想在每一个完整的收藏中都做的事情。因为直接缓冲区位于堆之外,所以它不受集合的影响另一方面,每个数据访问都是一个JNI调用。只有基准测试才能告诉您这对您的特定应用程序有帮助还是有伤害

JNI语句暗示使用JNI有一个缺点,但我不确定它是什么。有人能帮忙吗?我确实在堆栈溢出上发现了这个问题:


然而,我不相信从那一段中声明的上下文来看,作者暗示的缺点是JNI很难调试,或者它可能会破坏jvm。谢谢

JNI取决于您的应用程序。有时您将使用第三部分c库。Ant库可能未经过全面测试。它将包含内存泄漏或无效内存访问的错误。JNI有两大问题。这将使你的应用程序崩溃

您可以用c编写一个简单的库,如:

int * a = NULL;
*a = 20;

并用JAVA调用代码。如果没有JVM输出,您的JAVA应用程序将停止运行,并且您无法捕获JAVA中的任何异常。

这种情况似乎是在回避问题。考虑到JNI的低水平是多么可笑,我怀疑其开销是否有那么大。也就是说,您没有编组复杂类型或任何东西。也就是说:KD Gregory不了解直接缓冲区的用途。它们用于在通道之间进行复制,而实际上您根本不需要Java代码中的数据。它们通过不在JNI端和JVM端之间移动数据来保存JNI风格的操作。如果你在用Java操作数据,当然这些数据毫无意义,而且成本高昂。我认为这句话不准确。访问直接缓冲区的速度大约与访问阵列的速度一样快。没有对本机函数的“调用”。只是可能的边界检查和内存访问。@AleksandrDubinsky不可能。缓冲区位于JNI空间,而不是JVM空间。必须有一个JNI呼叫。这就是直接缓冲区的全部意义。请阅读问题,而不仅仅是标题。