2009-05-27 2 views
20

Я использую 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); 
} 

В одном выше, если я комментирую разделы между ///// Я не вижу никакой утечки памяти.

+5

Кажется, хорошо, откуда вы знаете, что это причина вашей утечки? –

+5

Я согласен с fd - пожалуйста, разместите некоторую информацию о том, как вы знаете, что это утечка. Указываете ли вы данные профилировщика? –

+7

Возможно, выпущенная строка не сразу собрана мусором. Поэтому вы наблюдаете увеличение использования памяти. Вы также можете попытаться прокомментировать только вызов opcdata_set_str() или opcmsg_ack() и проверить, не по-прежнему ли утечка памяти. – akarnokd

ответ

1

Релиз массив объект.

(* env) -> DeleteLocalRef (env, array);