2009-05-27 5 views
20

Sto utilizzando GetStringUTFChars per recuperare il valore di una stringa dal codice java utilizzando JNI e rilasciando la stringa utilizzando ReleaseStringUTFChars. Quando il codice è in esecuzione su JRE 1.4 non c'è perdita di memoria ma se lo stesso codice è in esecuzione con una versione 1.5 o superiore di JRE la memoria aumenta. Questa è una parte del codicePerdita di memoria utilizzando JNI per recuperare il valore di stringa dal codice Java

msg_id=(*env)->GetStringUTFChars(env, msgid,NULL); 
opcdata_set_str(opc_msg_id, OPCDATA_MSGID, msg_id); 
(*env)->ReleaseStringUTFChars(env, msgid,msg_id); 

Non riesco a capire il motivo della perdita. Qualcuno può aiutarmi?


Questo perché se si commenta il resto del codice ma si lascia questa parte si verifica la perdita di memoria. Questa è una parte del codice che sto usando

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); 
} 

In quella sopra è che se io commento sezioni tra ///// non vedo alcuna perdita di memoria.

+5

Sembra ok, come sai che questa è la causa della tua perdita? –

+5

Sono d'accordo con fd - per favore pubblica alcune informazioni su come sai che questa è la perdita. Avete dati di profiler che indicano questo? –

+7

Potrebbe essere che la stringa rilasciata non viene raccolta istantaneamente. Pertanto, si osserva un aumento nell'utilizzo della memoria. Puoi anche provare a commentare solo la chiamata opcdata_set_str() o opcmsg_ack() e controllare se perdura ancora memoria. – akarnokd

risposta

1

Versione matrice oggetto.

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