मैं अपने मुख्य में एक मूल कार्य को बुला रहा हूं और यह थोड़ी देर के अंदर है।जावा में देशी कोड कॉल करते समय यह कैसे पता चलेगा कि यह स्मृति रिसाव है या नहीं?
public static void main (String[] args) throws Throwable {
testDLL test = new testDLL();
String ar[];
while (true){
System.out.println("Memory before garbage collection: " + Runtime.getRuntime().freeMemory());
ar = test.GetSomething("###");
test.finalize();
System.gc();
Thread.sleep(5000);
System.out.println("Memory after garbage collection: " + Runtime.getRuntime().freeMemory());
System.out.println();
}
}
निम्नलिखित कार्यक्रम के उत्पादन में है:
Memory before garbage collection: 1915288
Memory after garbage collection: 1915136
Memory before garbage collection: 1915136
Memory after garbage collection: 1914984
Memory before garbage collection: 1914984
Memory after garbage collection: 1916624
Memory before garbage collection: 1916624
Memory after garbage collection: 1916472
Memory before garbage collection: 1916472
Memory after garbage collection: 1916320
Memory before garbage collection: 1916320
Memory after garbage collection: 1916168
Memory before garbage collection: 1916168
Memory after garbage collection: 1916624
Memory before garbage collection: 1916624
Memory after garbage collection: 1916472
(के बारे में 1 मिनट के लिए चल रहा है) मुझे लगता है कि यह एक स्मृति रिसाव नहीं है। लेकिन जब मैं विंडोज़ के टास्क मैनेजर खोलता हूं, प्रक्रिया का आकार javaw.exe बढ़ता रहता है (पुनरावृत्ति के दौरान प्रत्येक पर 100 केबी)। जानना चाहते हैं कि यह एक स्मृति रिसाव है या क्या मुझे इसे अनदेखा करना चाहिए? या क्या इसका मतलब मूल कार्य में स्मृति रिसाव है?
एफवाईआई मैंने किसी भी मेमोरी लीक के अपने मूल कार्य को दो बार जांच लिया है!
धन्यवाद!
संपादित करें:
मूल निवासी समारोह:
JNIEXPORT jobjectArray JNICALL Java_testDLL_GetSomething
(JNIEnv * env, jobject jobj, jstring approvedJString){
const int num = 100;
jboolean * isCopy;
jobjectArray serialNumArrJobj;
const char* approved = env->GetStringUTFChars(approvedJString, isCopy);
string serialNumArr[num];
//*
* Long lengthy code here
* Populates the string array "serialNumArr"
*//
// ========
env->ReleaseStringUTFChars(approvedJString, approved);
env->DeleteLocalRef(approvedJString);
env->DeleteLocalRef(jobj);
////////////
int i, sizeOfArr = 0;
for(i = 0; i < num; i++) {
if (serialNumArr[i].empty())
break;
else
sizeOfArr++;
}
serialNumArrJobj = (jobjectArray)env->NewObjectArray(sizeOfArr,
env->FindClass("java/lang/String"),
env->NewStringUTF(""));
for(i = 0; i < sizeOfArr; i++) {
env->SetObjectArrayElement(serialNumArrJobj,
i,
env->NewStringUTF(serialNumArr[i].c_str()));
}
return serialNumArrJobj;
}
Pls। अपने मूल कार्य भी पोस्ट करें। – Azodious
@Azodious वास्तव में इसकी काफी लंबी है। मैं सी ++ में डब्लूएमआई का उपयोग कर रहा हूं। लेकिन मैं उस भाग को पोस्ट कर सकता हूं जहां jni चर का उपयोग किया जाता है। :) – HashimR
मुझे स्मृति उपयोग में बहुत अधिक बदलाव दिखाई नहीं देता है। अपेक्षाकृत स्थिर होने लगता है। क्या मैं कुछ भूल रहा हूँ? –