【发布时间】:2011-12-02 13:14:31
【问题描述】:
我正在用 Java 为 C++ 程序编写一个包装器。包装器是使用 SWIG 完成的。我有以下问题:当我从 Java 调用一个在 C++ 中创建一个大对象的函数时,Java 没有“看到”它分配了很多内存,因为它没有在 Java 的堆中分配。问题是当对象被删除时没有调用垃圾收集器,因为从 Java 端有大量可用内存。我尝试的是实现这里描述的内容:http://www.swig.org/Doc1.3/Java.html#java_heap_allocations。这个想法是在 Java 的堆中为 C++ 分配内存空间。由于我不想对每个 new 都使用它,因此我已将 new 和 delete 重命名,并在需要时从我的 C++ 代码中显式使用它们。
这种机制似乎有效(我可以看到 Java 的堆正在被垃圾收集器扩大和缩小)但不幸的是,我在memcpy 期间似乎发生了随机崩溃。
如果我手动调用垃圾收集器,我的程序正在运行,但它不是一个非常干净的方法。
感谢您提供任何线索。
【问题讨论】:
-
“很遗憾,因为大多数 Java 实现都调用 malloc 和 free,所以这个解决方案不适用于 C 包装的结构”你检查过这不是你的情况吗?
-
好吧,您希望 Java 从其堆中为您提供内存,而不是 GC,直到您不再需要该对象。 java如何知道后者何时发生?
-
请查看我帖子中的链接,您会看到
delete操作员调用env->DeleteGlobalRef(pJalloc->ref); env->ReleaseByteArrayElements -
@Viruzzo 我只使用 C++ 代码
-
你的程序很可能有错误。混合和匹配各种分配器听起来像是奇怪的 memcpy 错误的秘诀。
标签: java c++ java-native-interface swig