2011-11-23 4 views
9

मैं अपने मुख्य में एक मूल कार्य को बुला रहा हूं और यह थोड़ी देर के अंदर है।जावा में देशी कोड कॉल करते समय यह कैसे पता चलेगा कि यह स्मृति रिसाव है या नहीं?

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; 
} 
+2

Pls। अपने मूल कार्य भी पोस्ट करें। – Azodious

+0

@Azodious वास्तव में इसकी काफी लंबी है। मैं सी ++ में डब्लूएमआई का उपयोग कर रहा हूं। लेकिन मैं उस भाग को पोस्ट कर सकता हूं जहां jni चर का उपयोग किया जाता है। :) – HashimR

+0

मुझे स्मृति उपयोग में बहुत अधिक बदलाव दिखाई नहीं देता है। अपेक्षाकृत स्थिर होने लगता है। क्या मैं कुछ भूल रहा हूँ? –

उत्तर

1

आपका उम्मीदों गलत कर रहे हैं। आप कचरा कलेक्टर के संकेत के मुकाबले System.gc() की अपेक्षा नहीं कर सकते हैं, और finalize() पर कॉल करना स्वयं पूरी तरह से गलत है।

+0

मुझे लगता है कि आपने सावधानी से प्रश्न नहीं पढ़ा है, समस्या जावा पक्ष के साथ नहीं है, भले ही मैं 'अंतिमकरण()' और' System.gc() 'को हटा दूं, फिर भी कुछ स्मृति रिसाव है! – HashimR

0

मुझे लगता है कि आपको यूनिट परीक्षण लिखने की आवश्यकता है जो मूल कोड को सीधे जावा कोड की तरह कॉल करता है, जैसे मॉक परीक्षण।

संबंधित मुद्दे