2011-11-23 21 views
9

Ana sayfamda yerel bir işlev çağırıyorum ve bir süre döngüsünün içinde.Java'da yerel kod çağrılırken bellek sızıntısı olup olmadığı nasıl bilinir?

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

aşağıdaki programın çıktısı: o bir bellek sızıntısı tahmin

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 

(yaklaşık 1 dakika boyunca çalışan). Ama ben pencerelerin görev yöneticisi açtığınızda, işlemin boyutu javaw.exe artmaya devam ediyor (her iterasyonda 100 KB). Bir bellek sızıntısı olup olmadığını bilmek mi yoksa sadece göz ardı mıyım? VEYA Bu, yerel işlevde bir bellek sızıntısı olduğu anlamına mı geliyor?

FYI, herhangi bir bellek sızıntısı ile ilgili yerel işlevimi iki kez kontrol ettim!

Teşekkürler!

DÜZENLEME:

Yerli fonksiyonu:

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. Yerel işlevinizi de gönderin. – Azodious

+0

@Azodious aslında oldukça uzun. C++ 'da WMI kullanıyorum. Ama jni değişkenlerin kullanıldığı kısmı yayınlayabilirim. :) – HashimR

+0

Bellek kullanımında büyük bir değişiklik görmüyorum. Nispeten istikrarlı görünüyor. Bir şey mi eksik? –

cevap

1

Beklentileriniz yersiz bulunmaktadır. System.gc()'un çöp toplayıcısına bir ipucu vermekten daha fazlasını bekleyemeyeceğini ve finalize() numaralı telefonu arayacağınızı tamamen doğru olarak düşünemezsiniz.

+0

Sanırım soruyu dikkatlice okuyorsunuz, sorun java tarafında değil, 'finalize()' ve 'System.gc()' yi kaldırsam bile, bazı bellek sızıntısı var! – HashimR

0

Yerel kodları doğrudan Mock testleri gibi Java kodu gibi çağıran birim testleri yazmanız gerektiğini düşünüyorum.