2011-08-08 72 views
2

看來下面的代碼正在泄漏內存。我檢查了JVM內存利用率,並且在隨後的調用後沒有釋放內存。當我以獨立方式運行Java時,它可以很好地處理多個調用並保持釋放內存的功能。JNI Java從C內存泄漏

我真的很感激任何幫助。

jobjectArray my_obj = (jobjectArray) env->CallObjectMethod(cls, mid, qstr, pstr); 

length = env->GetArrayLength(my_obj); 
//printf("\nArray Length = %d \n", length); 

char result[256]; 
const char *cstr; 
int numberOfCharsInThisRow = 0; 


array1 = (char **)malloc(length * sizeof(char *)); 
/*Check if pointer is null, if not then free its memory first*/ 

for(int i=0; i< length ; i++){ 
    cstr = env->GetStringUTFChars((jstring)env->GetObjectArrayElement(my_obj,i), 0); 

    numberOfCharsInThisRow = std::strlen(cstr)+1; 


    *(array1+i)=(char *)malloc(numberOfCharsInThisRow * sizeof(char)); 

    std::strcpy(result, cstr); 
    std::strcpy(*(array1+i),result); 


    env->ReleaseStringUTFChars((jstring)env->GetObjectArrayElement(my_obj,i), cstr); 
     } 
    env->DeleteLocalRef(my_obj); 
} 

    //printf("\n\nDestroy JVM\n\n"); 
    //jvm->DestroyJavaVM(); 

} 

空隙libdeallocatememory(字符**數組1,INT長度) { // printf的( 「自由陣列存儲器\ n」);

for (int j=0 ;j <length ;j ++) 
{ 
    free(array1+j); 
} 

free(array1); 

}

+0

我假設你釋放你的某個時間點分配的指針和這個心不是你所談論的 – jogabonito

+0

你好泄漏,沒有沒有調用釋放指針,心不是ReleaseStringUTFChars和DeleteLocalRef照顧它?如果您願意告訴我我需要釋放哪些指針,我將不勝感激 – ShamsR

回答

1

您應該釋放陣列1的指針,一旦你與他們做。這個功能在現實中有什麼作用?從我理解的功能中,您正在從java複製到c指針。接下來發生什麼?通過調用ReleaseStringUTF,您將通知JVM它不在本機中使用,因此可以在需要時進行GCG處理
認爲我發現了這個問題。釋放代碼應該是這樣

for (int j=0 ;j<length; j++ ) 
{ 
    free(array1[j]); 
} 

free(array1); 

初始分配應該是array1 = (char **)malloc(length * sizeof(int *));
不同的是int*而不是char*。這是因爲這個數組只是一個指針數組。指針大小是int。下一個級別在您爲您的字符串分配內存的循環中。它應該是array1[i] = (char *)malloc(numberOfCharsInThisRow * sizeof(char));
這意味着最初你分配了一個指針數組。現在對於該文件的每個元素,您正在分配內存來保存它自己的字符串。我認爲即使*(array1+i)也可以工作,但我覺得這更容易閱讀。所以當你釋放時,首先你釋放你分配的單個數組元素,然後釋放你最初分配的整個數組。作爲一個例子,看看你當前的釋放函數。當j = 0和最後一個空閒時間之間沒有區別。我很驚訝你沒有遇到任何崩潰。
看看http://c-faq.com/~scs/cclass/int/sx9b.html

也試試以下jstring myString =env->GetObjectArrayElement(my_obj,i);使用myString的拿到UTFChars,然後調用env->ReleaseStringUTFChars(mystring, cstr)

+0

嗨,array1在使用後會被釋放。這是array1被釋放的方式。該函數是Java方法的封裝器,它將SQL調用的結果作爲數組返回。 – ShamsR

+1

嗨,陣列1被使用後被釋放。下面是我如何編輯主文章釋放array1。該函數是Java方法的封裝器,它將SQL調用的結果作爲數組返回。我們注意到,如果我們移除mallocing array1的調用,它仍會增加JVM堆大小,所以這導致我們認爲ReleaseStringUTF沒有釋放內存。將不勝感激任何幫助 – ShamsR

+0

你好,我釋放像你提到的數組1,問題仍然存在,我不知道它是否與ReleaseStringUTF不釋放內存或我們複製到C指針的方式有問題。 – ShamsR