我正在使用SWIG编写Java的C++程序包装器。当我从Java中调用一个函数来创建一个大的C++对象时,Java并不知道它已经分配了很多内存,因为它没有在Java的堆中分配。问题是垃圾收集器在对象被删除时不会被调用,因为从Java的角度来看有足够的空闲内存。我尝试实现这里描述的方法:http://www.swig.org/Doc1.3/Java.html#java_heap_allocations。这个想法是在Java的堆中为C++分配内存空间。由于我不想在每个
这种机制似乎有效(我可以看到Java的堆正在增长,并且通过垃圾收集器缩小),但不幸的是我遇到了随机崩溃,似乎发生在
如果我手动调用垃圾收集器,我的程序可以正常工作,但这并不是一个非常干净的方法。
感谢任何线索。
new
上使用它,所以我重命名了new
和delete
,并在需要的地方从我的C++代码中显式使用它们。这种机制似乎有效(我可以看到Java的堆正在增长,并且通过垃圾收集器缩小),但不幸的是我遇到了随机崩溃,似乎发生在
memcpy
过程中。如果我手动调用垃圾收集器,我的程序可以正常工作,但这并不是一个非常干净的方法。
感谢任何线索。
delete
运算符调用了env->DeleteGlobalRef(pJalloc->ref); env->ReleaseByteArrayElements
。 - Yann Sagon