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

时间:2013-04-04 10:25:13

标签: java c++ jboss java-native-interface nailgun

我们愿意与另一个来自Java的团队开发的C ++库进行沟通。

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

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

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

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

我们所考虑的解决方案是从将在JBoss中运行的父JVM中启动多个Java进程,这是我们愿意保护的。

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

在这种情况下,我们认为的解决方案是使用几个Nailgun服务器。每个人都会加载一个JVM广告,可以访问我们想要启动的程序(在类路径中)。

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我最喜欢集群方法,您将受到Java崩溃的保护(即使使用Pure Java,JVM也可能崩溃。无限循环或全内存容器错误也会导致JVM失效)并且能够使用您的SWIG溶液

另一方面,如果您害怕崩溃,您还应该担心内存损坏会改变您的业务数据。