Java -> C++ 使用 SWIG over JNI 的通信。防止C++错误和内存泄漏

Java -> C++ communication using SWIG over JNI. Protect from C++ errors and memory leaks

本文关键字:C++ 防止 通信 错误 泄漏 内存 over gt 使用 Java SWIG      更新时间:2023-10-16

我们愿意与其他Java团队开发的c++库进行通信。

我们看到的最自然和最优的方法是使用JNI,但是在开发期间为了简单起见使用SWIG。

我们实际上已经开发出原型并且运行良好。在第一个使用SWIG director的Java->c++通信之后,还有一个c++ ->Java通信。

我们看到的主要问题是暴露于c++库中可能的错误,例如内存损坏和内存泄漏。

似乎没有办法有效地防止这些错误。例如,在c++中执行abort(模拟一些错误的内存操作)将终止JVM

我们想到的解决方案是从父JVM中启动几个java进程,这些进程将在JBoss中运行,这是我们愿意保护的。

启动java进程是困难的,主要是因为首先需要启动JVM。

在这种情况下,我们想到的解决方案是使用几个nail - gun服务器。每个都将加载一个JVM,并且可以访问(在类路径中)我们想要启动的程序。

每个Nailgun Server中的每个JVM(关系是1-1)能够在同一个JVM中并发地执行我们的程序。如果发生一些错误,所有的这个Nailgun JVM中的执行将崩溃(但是JBoss JVM将是活的)。出于这个原因,我们计划使用几个执行次数有限的Nailgun服务器并使用某种负载平衡将执行分派到任何服务器。此外,Nailgun服务器将定期重新启动,以防止内存泄漏。

我们认为这是防止c++崩溃的好方法。

但是我们想问问社区是否有更好的方法。

我忘了提到我们正在考虑的另一个解决方案是在我们的战争中有一个集群的JBoss,用于故障转移。然后可能合并Nailgun服务器或不依赖于c++程序的可靠性。纯JBoss集群应用程序(没有Nailgun进程)的好处是我们不需要任何类型的进程间通信,整个操作将在具有线程的进程中执行。

有时候,保护Java进程免受第三方本地代码风险的最简单方法是在单独的进程中运行有风险的代码。

然而,这可能需要进程间通信,这会增加成本和复杂性。

我最喜欢集群方法,这样可以避免Java崩溃(即使使用纯Java, JVM也会崩溃)。并且无限循环或全内存吞噬错误也会使JVM停滞),并且可以使用您的SWIG解决方案。

另一方面,如果你害怕崩溃,你也应该害怕内存损坏改变你的业务数据。