2009-05-27 24 views
20

Tôi đang sử dụng GetStringUTFChars để truy xuất giá trị của chuỗi từ mã java bằng cách sử dụng JNI và giải phóng chuỗi bằng cách sử dụng ReleaseStringUTFChars. Khi mã đang chạy trên JRE 1.4 không có rò rỉ bộ nhớ nhưng nếu cùng một mã đang chạy với một phiên bản JRE 1.5 hoặc cao hơn thì bộ nhớ sẽ tăng lên. Đây là một phần của mã sốRò rỉ bộ nhớ bằng cách sử dụng JNI để truy xuất giá trị của chuỗi từ mã Java

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

Tôi không thể hiểu lý do bị rò rỉ.Có ai đó giúp đỡ?


Điều này là vì nếu tôi nhận xét phần còn lại của mã nhưng để phần này bị rò rỉ bộ nhớ. Đây là một phần của mã mà tôi đang sử dụng

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

Trong phần trên là nếu tôi nhận xét các phần giữa ///// Tôi không thấy bất kỳ rò rỉ bộ nhớ nào.

+5

Có vẻ ok, làm cách nào bạn biết đây là nguyên nhân gây ra rò rỉ của bạn? –

+5

Tôi đồng ý với fd - vui lòng đăng một số thông tin về cách bạn biết đây là sự rò rỉ. Bạn có dữ liệu hồ sơ chỉ ra điều này? –

+7

Nó có thể là chuỗi phát hành không phải là ngay lập tức thu gom rác thải. Vì vậy, bạn quan sát sự gia tăng sử dụng bộ nhớ. Bạn cũng có thể thử nhận xét chỉ là lệnh opcdata_set_str() hoặc opcmsg_ack() và kiểm tra xem nó có rò rỉ bộ nhớ hay không. – akarnokd

Trả lời

1

Phát hành mảng đối tượng.

(* env) -> DeleteLocalRef (env, mảng);

Các vấn đề liên quan