2

我们愿意与另一个 Java 团队开发的 C++ 库进行交流。

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

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

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

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

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

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

在这种情况下,我们想到的解决方案是使用多个 Nailgun 服务器。每个都将加载一个 JVM 广告,将有权访问(在类路径中)我们要启动的程序。

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

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

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

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

4

2 回答 2

1

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

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

于 2013-04-04T13:46:43.120 回答
0

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

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

于 2013-04-04T13:56:42.330 回答