JNI fuite de mémoire à partir du tableau d'octets
J'ai un programme java qui appelle une fonction native de nombreuses fois. Mon problème est que cette fonction a une fuite de mémoire et tout ce que je faire pour se débarrasser de lui causer un vidage de la mémoire. Toute aide serait grandement appréciée.
C'est mon code
JNIEXPORT void JNICALL Java_class_method_getInput
(JNIEnv *env, jobject obj)
{
if (inputIsAvailable)
{
int size = getBufferCurrentIndex();
size -= getBufferReadIndex();
size *= 2;
char *finalSendArray = new char[size];
getCommand(finalSendArray);
jbyteArray byteArray = env->NewByteArray(size / 2);
env->SetByteArrayRegion(byteArray, 0, size / 2, (jbyte*) finalSendArray);
while(methodID == 0)
{
jclass cls = env->GetObjectClass(obj);
methodID = env->GetMethodID(cls, "setCommand", "([B)V" );
}
env->CallVoidMethod(obj, methodID, byteArray);
//env->ReleaseByteArrayElements(byteArray, (jbyte*) finalSendArray, JNI_ABORT);
Mon problème est que le ci-dessus ^ code provoque un vidage de la mémoire si c'est sans commentaire, si ce n'est pas décommenté mon programme fonctionne de la mémoire en quelques minutes
env->DeleteLocalRef(byteArray);
delete[] finalSendArray;
}
}
toute aide serait appréciée. Merci!
La libération de la
A ma réponse à résoudre votre problème? Marquer comme correcte si elle l'a fait. Pourquoi faites-vous cela en C? Ce n'getCommand faire? Pourrait-il être fait en java? jni est cher.
hey désolé il a fallu si longtemps pour une réponse, j'ai encore une fuite quelque part. Je ne sais pas où. Je suis à l'aide de c++ parce que je suis juste à la réutilisation de code qui a déjà été construit. Il pourrait être ré-écrit en Java, mais je préfère les garder dans la mise en œuvre.
Je souhaite que avait travaillé... mais il n'a malheureusement pas.
Désolé de l'entendre. Je ne sais pas vraiment; le seul conseil que je pourrais donner est de lire la JNI spec attentivement et assurez-vous de comprendre toutes les différentes durées de vie et les dépendances.
byteArray
d'abord, puis de les supprimer de la mémoire sous-jacente?A ma réponse à résoudre votre problème? Marquer comme correcte si elle l'a fait. Pourquoi faites-vous cela en C? Ce n'getCommand faire? Pourrait-il être fait en java? jni est cher.
hey désolé il a fallu si longtemps pour une réponse, j'ai encore une fuite quelque part. Je ne sais pas où. Je suis à l'aide de c++ parce que je suis juste à la réutilisation de code qui a déjà été construit. Il pourrait être ré-écrit en Java, mais je préfère les garder dans la mise en œuvre.
Je souhaite que avait travaillé... mais il n'a malheureusement pas.
Désolé de l'entendre. Je ne sais pas vraiment; le seul conseil que je pourrais donner est de lire la JNI spec attentivement et assurez-vous de comprendre toutes les différentes durées de vie et les dépendances.
OriginalL'auteur Tyler Davis | 2013-09-06
Vous devez vous connecter pour publier un commentaire.
ReleaseByteArrayElements permettra également de libérer de la mémoire, si vous utilisez le JNI_ABORT param. Ainsi, lorsque vous faites de la supprimer et de libérer plus tard, l'un de ces pointeurs pointant vers la mémoire non initialisée qui est à l'origine de la décharge.
L'une de ces travaux, j'ai assez certain que c'est la première qui fonctionne.
Essayer si la première échoue.
Mettre une instruction print après la ReleaseByteArrayElements, vous verrez que votre programme est en cours d'exécution au-delà de la commande et de s'écraser sur la Libération/Delete[]
Recherche pour "Tableau 4-10 Primitive de la Matrice de Libération Modes"
code
*** glibc détecté *** /usr/lib/jvm/java-7-openjdk-amd64/bin/java: double gratuit ou la corruption (fasttop): 0x00007fb8a4001030 ***code
la deuxième, j'ai toujours une fuite de mémoire. Je vais assurez-vous que la fuite de mémoire est en fait là-basIl pourrait être dans getCommand. N'est-il plus s'écraser maintenant au même endroit?
Le journal de fichiers point à la fonction SetByteArrayRegion et il jette l'erreur bad_alloc
Pourrait un de vos allocations d'échouer?(retourner null). De combien de mémoire vous avez alloué à la JVM? Vérifiez si l'un de ces pointeurs sont NULL avant d'appeler setByteArrayRegion. Si elles le sont, imprimer quelque chose, écrire pour le journal, ou lever une exception. Est bad_alloc jeter sur la première JNI appel? ou après un tas?(mem fuite)
Il se pourrait que vous êtes à court de mémoire de masse. Découvrez cette augmentation, stackoverflow.com/questions/1565388/increase-heap-size-in-java
OriginalL'auteur JustinDanielson