Я использую GetStringUTFChars для извлечения значения строки из java-кода с использованием JNI и освобождения строки с помощью ReleaseStringUTFChars. Когда код работает на JRE 1.4, утечки памяти нет, но если один и тот же код работает с версией JRE 1.5 или более поздней, память увеличивается. Это часть кодаУтечка памяти с использованием JNI для извлечения значения String из кода Java
msg_id=(*env)->GetStringUTFChars(env, msgid,NULL);
opcdata_set_str(opc_msg_id, OPCDATA_MSGID, msg_id);
(*env)->ReleaseStringUTFChars(env, msgid,msg_id);
Я не могу понять причину утечки. Может кто-то помочь?
Это связано с тем, что если я прокомментирую остальную часть кода, но оставлю эту часть утечки памяти. Это часть кода, который я использую
JNIEXPORT jobjectArray JNICALL Java_msiAPI_msiAPI_msgtoescalate(JNIEnv *env,
jobject job,
jstring msgid,
jlong msgseverity,
jstring msgprefixtext,
jint flag)
{
opcdata opc_msg_id; /* data struct to store a mesg ID */
const char *msg_id;
int ret, ret2;
jint val;
val=67;
jstring str=NULL;
jobjectArray array = NULL;
jclass sclass=NULL;
/* create an opc_data structure to store message ids of */
/* messages to escalate */
if ((ret2=opcdata_create(OPCDTYPE_MESSAGE_ID, &opc_msg_id))!= OPC_ERR_OK)
{
fprintf(stderr, "Can't create opc_data structure to store message. opcdata_create()=%d\n", ret2);
cleanup_all();
}
//////////////////////////////////////////////////////////
msg_id=(*env)->GetStringUTFChars(env,msgid,NULL);
opcdata_set_str(opc_msg_id, OPCDATA_MSGID, msg_id);
(*env)->ReleaseStringUTFChars(env, msgid, msg_id);
ret=opcmsg_ack(connection,opc_msg_id);
//////////////////////////////////////////////////////////
if(flag==0 && ret==0)
{
sclass = (*env)->FindClass(env, "java/lang/String");
array = (*env)->NewObjectArray(env, 2, sclass, NULL);
str=(*env)->NewStringUTF(env,"0");
(*env)->SetObjectArrayElement(env,array,0,str);
(*env)->DeleteLocalRef(env, str);
str=(*env)->NewStringUTF(env,"0");
(*env)->SetObjectArrayElement(env,array,1,str);
(*env)->DeleteLocalRef(env, str);
}
opcdata_free(&opc_msg_id);
if(ret!=0)
return NULL;
else
return(array);
}
В одном выше, если я комментирую разделы между ///// Я не вижу никакой утечки памяти.
Кажется, хорошо, откуда вы знаете, что это причина вашей утечки? –
Я согласен с fd - пожалуйста, разместите некоторую информацию о том, как вы знаете, что это утечка. Указываете ли вы данные профилировщика? –
Возможно, выпущенная строка не сразу собрана мусором. Поэтому вы наблюдаете увеличение использования памяти. Вы также можете попытаться прокомментировать только вызов opcdata_set_str() или opcmsg_ack() и проверить, не по-прежнему ли утечка памяти. – akarnokd