与c+共享内存分配+;和JNI 我在java中编写一个C++程序包。包装器是使用SWIG完成的。我有以下问题:当我调用java中的函数,它在C++中创建大对象时,java没有“看到”它分配了大量内存,因为java中没有分配它。问题是当对象被删除时,垃圾收集器没有被调用,因为在Java端有大量的可用内存。我尝试的是实现这里描述的内容:。这个想法是在java堆中分配C++空间。因为我不想对每个新的< /代码>使用它,我已经重命名了新< /COD>和 Dele> ,并在需要的地方从我的C++代码中明确地使用它们。
这种机制似乎有效(我可以看到Java的堆在垃圾收集器中不断增长和收缩),但不幸的是,我遇到了一个随机崩溃,这似乎是在与c+共享内存分配+;和JNI 我在java中编写一个C++程序包。包装器是使用SWIG完成的。我有以下问题:当我调用java中的函数,它在C++中创建大对象时,java没有“看到”它分配了大量内存,因为java中没有分配它。问题是当对象被删除时,垃圾收集器没有被调用,因为在Java端有大量的可用内存。我尝试的是实现这里描述的内容:。这个想法是在java堆中分配C++空间。因为我不想对每个新的< /代码>使用它,我已经重命名了新< /COD>和 Dele> ,并在需要的地方从我的C++代码中明确地使用它们。,java,c++,java-native-interface,swig,Java,C++,Java Native Interface,Swig,这种机制似乎有效(我可以看到Java的堆在垃圾收集器中不断增长和收缩),但不幸的是,我遇到了一个随机崩溃,这似乎是在memcpy期间发生的 如果我手动调用垃圾收集器,我的程序可以工作,但它不是一个非常干净的方法 谢谢你提供任何线索。事实上,我没有注意到swig网站上的以下行: 如果要使用gcc启用的优化(例如-O2),请确保也使用-fno严格别名进行编译 这似乎解决了问题难道你不能简单地通过SWIG手动调用C++对象析构函数吗?“不幸的是,因为大多数Java实现都调用malloc和free,所以
memcpy
期间发生的
如果我手动调用垃圾收集器,我的程序可以工作,但它不是一个非常干净的方法
谢谢你提供任何线索。事实上,我没有注意到swig网站上的以下行: 如果要使用gcc启用的优化(例如-O2),请确保也使用-fno严格别名进行编译
<>这似乎解决了问题难道你不能简单地通过SWIG手动调用C++对象析构函数吗?“不幸的是,因为大多数Java实现都调用malloc和free,所以这个解决方案对C包装的结构不起作用”您是否检查过这不是您的情况?好的,您希望Java从其堆中为您提供内存,而不是GC,直到您不再需要该对象。java如何知道后一种情况何时发生?请看一下我帖子中的链接,您将看到
delete
操作符调用env->DeleteGlobalRef(pJalloc->ref);Env- > ReleSeBytAREARYARECTON< /代码> @ ViuZuo,我只使用C++代码,很可能在程序中有bug。混合和匹配各种分配器听起来像是制造奇怪的memcpy bug的秘方。