使用JNI检索字符串';Java代码中的s值
我使用GetStringUTFChars从java代码中使用JNI检索字符串的值,并使用ReleaseStringUTFChars释放字符串。当代码在JRE 1.4上运行时,没有内存泄漏,但如果同一代码在JRE 1.5或更高版本上运行,内存会增加。这是代码的一部分使用JNI检索字符串';Java代码中的s值,java,c,string,memory-leaks,java-native-interface,Java,C,String,Memory Leaks,Java Native Interface,我使用GetStringUTFChars从java代码中使用JNI检索字符串的值,并使用ReleaseStringUTFChars释放字符串。当代码在JRE 1.4上运行时,没有内存泄漏,但如果同一代码在JRE 1.5或更高版本上运行,内存会增加。这是代码的一部分 msg_id=(*env)->GetStringUTFChars(env, msgid,NULL); opcdata_set_str(opc_msg_id, OPCDATA_MSGID, msg_id); (*env)->
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);
}
在上面的一个例子中,如果我对/////I之间的部分进行注释,我看不到任何内存泄漏。Releasearrayobject
(*env)->DeleteLocalRef(env,数组) 看起来还好,你怎么知道这是你的泄漏的原因?我同意fd-请发布一些信息,说明你是如何知道这是泄漏的。是否有探查器数据表明这一点?可能是释放的字符串没有立即被垃圾收集。因此,您观察到内存使用量的增加。您也可以尝试注释掉opcdata\u set\u str()或opcmsg\u ack()调用,并检查它是否仍然泄漏内存。请问opcdata\u set\u str函数的原型(声明)是什么?。。。它有什么作用?我想说漏洞就在这个函数里面。您是否应该采取一些补充措施来释放该数据项?