JNI:在本机代码中持有Java对象引用的开销?

时间:2011-05-25 14:33:16

标签: java c++ performance java-native-interface reference

我正在研究通过JNI将JRE集成到C ++应用程序中。

在C ++应用程序中持有大量Java对象引用的开销是多少(JNI用语中的全局引用)?

使用这种方法我是否应该注意到任何问题(除了显而易见的,例如手动解除分配引用)?

2 个答案:

答案 0 :(得分:3)

(a)开销与从Java进行开销相同。您正在阻止对象被垃圾收集。

(b)除非您正确执行,否则跨JNI调用保持对象引用对JVM可能是致命的。您需要仔细阅读JNI规范中有关全局和本地引用的部分。您还需要考虑使用弱引用而不是全局引用。

答案 1 :(得分:-2)

这更多的是一种观点而非答案,但考虑到您可以选择,我强烈建议不要使用JNI,而是使用其他机制(如套接字或Web服务)在C ++应用程序和Java VM之间进行通信。如果你做对了,JNI解决方案显然会比这两种方案快得多,但如果性能并不重要,那么我对JNI的体验是最好避免使用。

正如EJP正确指出(+1)如果你没有正确管理你的JNI Java对象,会发生非常糟糕的事情 - 包括虚拟机死亡。我也发现JNI代码很难测试。