【问题标题】:sharing memory allocation with c++ and JNI与 c++ 和 JNI 共享内存分配
【发布时间】: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 都使用它,因此我已将 newdelete 重命名,并在需要时从我的 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


【解决方案1】:

其实我并没有注意到 swig 网站的下面这行:

如果您要使用通过 gcc 启用的优化(例如 -O2),请确保您还使用 -fno-strict-aliasing 进行编译

这似乎解决了问题

【讨论】:

    【解决方案2】:

    您不能简单地通过 SWIG 手动调用 C++ 对象析构函数吗?这似乎对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 2014-06-21
      • 2013-02-14
      • 2011-02-10
      相关资源
      最近更新 更多