【发布时间】:2016-11-15 04:28:22
【问题描述】:
我正在使用一个使用 JNA 绑定到原始 C 库(该库称为 Leptonica)的 java 库。我遇到了必须在 C 代码中调用 free(data) 以释放内存的情况。但是,java中有什么函数可以释放内存吗?
在 C 代码中
void ImageData::SetPixInternal(Pix* pix, GenericVector<char>* image_data) {
l_uint8* data;
size_t size;
pixWriteMem(&data, &size, pix, IFF_PNG);
pixDestroy(&pix);
image_data->init_to_size(size, 0);
memcpy(&(*image_data)[0], data, size);
free(data);
}
函数 pixWriteMem() 将创建并为“数据”分配内存,您需要稍后执行 free(data) 以释放内存。
在 Java 代码中,我只能访问 pixWriteMem(),不能访问 SetPixInternal(),所以我无法释放“数据”,这会造成内存泄漏。
【问题讨论】:
-
除非你有特定的对象可以清除,否则,你需要等待垃圾收集器为你清理。
-
其他人都在谈论垃圾收集器和 Java 的内存。请注意,OP 正在谈论在 Java 中调用的 C 代码,请注意 JNI 标记。这不像让垃圾收集器清理那么简单。
-
您的
c代码与实物完全不同,请正确剪切/粘贴。 -
我同意@KevinDTimm。我认为这个问题比我们意识到的要多。
-
@KevinDTimm ,Aaron,是的,我将编辑 C 代码。由于原始代码涉及多个功能,所以我让它变得非常简单。我会改写它。是的,这个问题并不像让垃圾收集器清理那么简单。我已经尝试过 system.gc() 但它不工作
标签: java c memory-leaks java-native-interface jna