Java -> C++ 使用 SWIG over JNI 的通信。防止C++错误和内存泄漏
Java -> C++ communication using SWIG over JNI. Protect from C++ errors and memory leaks
我们愿意与其他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解决方案。
另一方面,如果你害怕崩溃,你也应该害怕内存损坏改变你的业务数据。
- 防止主数据类型C++的隐式转换
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何防止C++遗留代码中的挂起指针
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 如何防止初始值设定项列表中的错误值?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- C++ 防止在映射中放置()时调用析构函数
- 是否可以防止省略聚合初始化成员?
- 如何在多个线程中创建 QSql数据库连接时防止名称冲突
- 防止在C++中选择错误文件时提升 xml 解析器崩溃
- std::mutex 如何防止线程修改?
- 防止C++中的硬编码数字
- 防止在复制构造函数中隐式调用基构造函数
- 如何防止 CUDA-GDB 中的<优化输出>值
- 防止组合框被关闭
- 按下特定键时快速按此键.如何防止按下扳机键?(C++)
- 如何防止双精度值到整数的隐式转换
- SFINAE不能防止模棱两可的操作员过载吗?
- 什么可以防止类中相邻成员重叠