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

4

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

在C++应用程序中持有大量Java对象引用(JNI术语中的全局引用)会产生什么开销?

除了明显的手动释放引用之外,这种方法还有哪些问题需要注意?

2个回答

3

(a) 如果您从Java中执行此操作,开销与使用JNI相同。您正在防止对象被垃圾回收。

(b) 在JNI调用期间持有对象引用,除非正确处理,否则可能对JVM造成致命影响。您需要仔细阅读JNI规范中关于全局和本地引用的部分。您还需要考虑使用弱引用而不是全局引用。


-3

这更像是一种观点而不是答案,但是考虑到你有选择的权利,我强烈建议不要使用JNI,而是使用另一种机制(如套接字或Web服务)在C++应用程序和Java VM之间进行通信。如果你做得正确,JNI解决方案显然比这两种替代方案都要快得多,但如果性能不是关键问题,那么我的经验是最好避免使用JNI。

正如EJP所指出的(+1),如果你没有正确地管理JNI Java对象,会发生非常糟糕的事情,包括VM直接崩溃。我也发现JNI代码很难测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接