Освобождение ссылок из памяти - PullRequest
0 голосов
/ 01 августа 2011

Я создаю байтовый массив в Java и передаю его по ссылке на функцию jni.Это я делаю в цикле и иногда получаю ошибку нехватки памяти в jni.Я хотел знать, освобождает ли Java автоматически массив на каждой итерации или, поскольку он передается в функцию jni, это не ??

код JNI (bOldArray - это байтовый массив java, который я передаю jni какаргумент)

len = (*env)->GetArrayLength(env,bOldArray);
char *oldBuff = (char *)calloc(sizeof(char),MAX_SIZE);
jbyte* bytes = (*env)->GetByteArrayElements(env,bOldArray,0);
memcpy(oldBuff,bytes,len);
(*env)->ReleaseByteArrayElements(env,bOldArray,(jbyte *)bytes,0);

Ответы [ 2 ]

2 голосов
/ 13 апреля 2012

у вас есть 2 буфера, одна из которых передана из вашего Java-кода (bOldArray) и локального буфера (oldbuff), который вы разместили в строке 2.

на самом деле у вас может быть больше буферов, потому что

(*env)->GetArrayLength 

с почти наверняка делает неподвижную копию памяти (необходимой для c-указателя-доступа), которая содержит массив в вашем Java-коде и с

(*env)->ReleaseByteArrayElements(env,bOldArray,(jbyte *)bytes,0);

эта память копируется обратно в память вашего Java-массива (см. Документацию по последнему аргументу ReleaseByteArrayElements)

но о вашей проблеме: вы должны освободить oldBuff тоже.

free(oldBuff);

иначе виртуальная машина освобождает вашу c-копию массива java, но не самораспределяющуюся часть напрямую (это может быть сделано позже из-за времени жизни объекта и сборки мусора, но это непредсказуемо и, следовательно, из-за ошибка памяти также непредсказуема)

чтобы избежать механизма java-c-copy (ускоряет работу), используйте общий / статический буфер, такой как ByteBuffer

0 голосов
/ 01 августа 2011

Если вы используете GetByteArrayElements, вы должны вызвать ReleaseByteArrayElements после того, как закончите работу с массивом в JNI, потому что JVM будет препятствовать освобождению этого массива в Java, пока вы не сделаете это. Пожалуйста, отправьте код, чтобы получить более ясную идею

...