在 Android 上,直接 ByteBuffer 似乎永远不会释放其内存,即使在调用 System.gc() 时也不会。
例子:做
Log.v("?", Long.toString(Debug.getNativeHeapAllocatedSize()));
ByteBuffer buffer = allocateDirect(LARGE_NUMBER);
buffer=null;
System.gc();
Log.v("?", Long.toString(Debug.getNativeHeapAllocatedSize()));
在日志中给出两个数字,第二个至少比第一个大 LARGE_NUMBER。
我该如何摆脱这种泄漏?
添加:
按照 Gregory 在 C++ 端处理 alloc/free 的建议,然后我定义了
JNIEXPORT jobject JNICALL Java_com_foo_bar_allocNative(JNIEnv* env, jlong size)
{
void* buffer = malloc(size);
jobject directBuffer = env->NewDirectByteBuffer(buffer, size);
jobject globalRef = env->NewGlobalRef(directBuffer);
return globalRef;
}
JNIEXPORT void JNICALL Java_com_foo_bar_freeNative(JNIEnv* env, jobject globalRef)
{
void *buffer = env->GetDirectBufferAddress(globalRef);
free(buffer);
env->DeleteGlobalRef(globalRef);
}
然后我在 JAVA 端得到我的 ByteBuffer
ByteBuffer myBuf = allocNative(LARGE_NUMBER);
并释放它
freeNative(myBuf);
不幸的是,虽然它确实分配得很好,但它 a) 仍然保持根据分配的内存Debug.getNativeHeapAllocatedSize()
b) 导致错误
W/dalvikvm(26733): JNI: DeleteGlobalRef(0x462b05a0) failed to find entry (valid=1)
我现在完全糊涂了,我以为我至少理解了 C++ 方面的东西......为什么 free() 不返回内存?我做错了DeleteGlobalRef()
什么?